网站大量收购闲置独家精品文档,联系QQ:2885784924

二叉树遍历(前中后序遍历,三种方式).pdf

二叉树遍历(前中后序遍历,三种方式).pdf

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

⼆⼆叉叉树树遍遍历历((前前中中后后序序遍遍历历,,三三种种⽅⽅式式))

⽬录

刷题中碰到⼆叉树的遍历,就查找了⼆叉树遍历的⼏种思路,在做个总结。对应的LeetCode题⽬如下:

,,,

接下来以前序遍历来说明三种解法的思想,后⾯中序和后续直接给出代码。

⾸先定义⼆叉树的数据结构如下:

//Definitionforabinarytreenode.

structTreeNode{

intval;

TreeNode*left;

TreeNode*right;

TreeNode(intx:val(x,left(NULL,right(NULL{}

};

前前序序遍遍历历,,顺顺序序是是“根根-左左-右右”。。

使⽤递归实现:递归的思想很简单就是我们每次访问根节点后就递归访问其左节点,左节点访问结束后再递归的访问右节点。代码如下:

classSolution{

public:

vectorintpreorderTraversal(TreeNode*root{

if(root==NULLreturn{};

vectorintres;

helper(root,res;

returnres;

}

voidhelper(TreeNode*root,vectorintres{

res.push_back(root-val;

if(root-lefthelper(root-left,res;

if(root-righthelper(root-right,res;

}

};

使⽤辅助栈迭代实现:

算法为:先把根节点push到辅助栈中,然后循环检测栈是否为空,若不空,则取出栈顶元素,保存值到vector中,之后由于需要想访问左⼦节点,所以我们在将根节点的⼦节点

⼊栈时要先经右节点⼊栈,再将左节点⼊栈,这样出栈时就会先判断左⼦节点。

代码如下:

classSolution{

public:

vectorintpreorderTraversal(TreeNode*root{

if(root==NULLreturn{};

vectorintres;

stackTreeNode*st;

st.push(root;

while(!st.empty({

//将根节点出栈放⼊结果集中

TreeNode*t=st.top(;

st.pop(;

res.push_back(t-val;

//先⼊栈右节点,后左节点

if(t-rightst.push(t-right;

if(t-leftst.push(t-left;

}

returnres;

}

};

MorrisTraversal⽅法

具体的详细解释可以参考如下链接:

这种解法可以实现O(N的时间复杂度和O(1的空间复杂度。

在O(1空间进⾏遍历,最⼤的难点在于遍历到⼦节点的时候怎么重新返回⽗节点(并且节点中没有返回⽗节点的指针)。为了解决这个难点,Morris⽅法⽤到了线索⼆叉树

(threadedbinarytree的概念,但是在这个⽅法中不需要额外分配指针指向其前驱或者后继节点,⽽是利⽤叶⼦节点的左右空指针指向某种顺序遍历下的前驱节点或后继节点就

可以了。Morris给出了中序遍历的⽅法,在中序遍历的基础上修改便可得到前序和后续遍历。

算法步骤如下:

1.如果当前节点的左孩⼦为空,则输出当前节点并将其右孩⼦作为当前节点。

2.如果当前节点的左孩⼦不为空,在当前节点的左⼦树中找到当前节点在中序遍历下的前驱节点。

a.如果前驱节点的右孩⼦为空,将它的右孩⼦设置为当前节点。输

文档评论(0)

【晓娣】 + 关注
实名认证
内容提供者

好文档大家想

1亿VIP精品文档

相关文档