二叉树的三种遍历程序 c语言,C语言二叉树的三种遍历方式的实现及原理.pdf

C语语言言二二叉叉树树的的三三种种遍遍历历方方式式的的实实现现及及原原理理

二叉树遍历分为三种:前序、中序、后序,其中序遍历最为重要。为 叫这个名字?是根据根节点的顺序命名的。

比如上图正常的一个满节点,A :根节点、B:左节点、C :右节点,前序顺序是A BC (根节点排最先,然后同级先左后右);中

序顺序是BA C(先左后根最后右);后序顺序是BCA (先左后右最后根)。

比如上图二叉树遍历结果

前序遍历:A BCDEFGHK

中序遍历:BDCA EHGKF

后序遍历:DCBHKGFEA

分析中序遍历如下图,中序比较重要 (j ava很多树排序是基于中序,后面讲解分析)

下面介绍一下,二叉树的三种遍历方式,其中每一种遍历方式都有三种实现方式。

节点定义:

struct TreeNode

{

int val;

TreeNode *left,*right;

TreeNode(int val){

this->val = val;

this ->left = this->right = NULL;

}

};

先先序序遍遍历历

以上面这张图为例:我们讲讲树的三种遍历方式:

先序遍历:先访问根节点,然后访问左孩子,最后访问右孩子。

所以,上面遍历的结果是:GEDA CHS 。

下面,我们来看看具体代码实现

1.递递归归实实现现

void reOrder(TreeNode *root){

if (root==NULL)

return;

cout<val<

reOrder(root->left);

reOrder(root->right);

}

2.使使用用辅辅助助栈栈

实现思路:1.将根节点入栈

2.每次从栈顶弹出一个节点,访问该节点

3.把当前节点的右孩子入栈

4 .把当前节点的左孩子入栈

具体实现:

void reOrder2(TreeNode *root){

if (root == NULL)

return;

stack stk; //开辟一个栈空间

stk. ush(root);

while(!stk.em ty()){

TreeNode* Node = stk. o ();

cout<< Node->val;

if ( Node->right !=NULL)

stk. ush( Node->right);

if ( Node->left !=NULL)

stk. ush( Node->left);

}

}

3.Morris遍遍历历

Morris遍历,常数的空间即可在O(n)时间内完成二叉树的遍历。

O(1)空间进行遍历困难之处在于在遍历的子结点的时候如何重新返回其父节点?

在Morris遍历算法中,通过修改叶子结点的左右空指针来指向其前驱或者后继结点来实现的。

其本质:线索二叉树 (T hrea e Binary T ree),通过利用叶子节点空的right指针,指向中序遍历的后继节点,从而避免了对 stac

k 的依赖。

具体实现:

void reOrder(TreeNode* root){

if (root == NULL)

return;

TreeNode* Node = root;

while( Node != NULL){

if ( Node->left == NULL)

{

cout<< Node->val<

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值