非递归实现二叉树的先序遍历,中序遍历,后序遍历

非递归实现二叉树的先序遍历,中序遍历,后序遍历

1. 二叉树先序遍历(非递归)

先序的遍历的访问顺序为先根节点,再左孩子,最后右孩子。
所以,根据栈后进先出的特点,应先入栈右孩子,再入栈左孩子。

先序遍历,借助栈实现

1根节点入栈
2判断栈顶元素是否为空
3访问栈顶元素,出栈
4栈顶元素的右孩子若不为空,入栈。栈顶元素的左孩子不为空,入栈。
5循环2-4

  9 void TreePreLoop(TreeNode* root)
 10 {
 11     if(root==NULL)
 12     {
 13         return ;
 14     }
 15     //定义一个栈
 16     SeqStack stack;
 17    //栈的初始化
 18     SeqStackInit;
 19     //定义栈顶元素类型
 20     SeqStackType top;
 21     //根节点入栈
 22     SeqStcakPush(&stack,root);
 23     while(1)
 24     {
 25         int ret=SeqStackTop(&stack,&top);
 26         if(ret==-1)
 27         {
 28             return ;
 29         }
 30         printf("%c",top->data);
 31         SeqStackPop(&stack);
 32         if(top->rchild!=NULL)
 33         {
 34             //入栈
 35             SeqStackPush(&stack,top->rchild);
 36         }
 37         if(top->lchild!=NULL)
 38         {
 39             //入栈
 40             SeqStcakPush(&stack,top->lchild);
 41         }
 42     }  
 43     return ;
 44 }

2二叉树中序遍历(非递归)

借用栈实现
定义指针变量cur指向root
1当cur不为空时,入栈,cur指向左孩子,循环直到cur左孩子为空
2取栈顶元素如果为空则遍历完成
3如果栈顶元素不为空,访问栈顶元素,出栈,
4cur指向栈顶元素的右孩子
5循环1-4

 58 void TreeInOrder(TreeNode* root)
 59 {
 60     if(root==NULL)
 61     {
 62         return ;
 63     }
 64 
 65     //定义一个栈
 66     SeqStack stack;
 67     //对栈进行初始化
 68     SeqStackInit;
 69     //定义指针变量指向根节点
 70     TreeNode* cur=root;
 71     while(1)
 72     {
 73         //当根节点不为空
 74         while(cur!=NULL)
 75         {
 76             //入栈根节点
 77             SeqStackPush(&stack,cur);
 78            //cur指向跟栈顶元素的左孩子
 79             cur=cur->lchild;
 80         }
 81         //判断栈顶元素是否为空
 82         int ret=SeqStackTop(&stack,&cur);
 83         if(ret==-1)
 84         {
 85             //如果为空说明遍历结束
 86             return ;
 87         }
 88         //如果不为空访问栈顶元素,并出栈
 89         printf("%c",cur->data);
 90         SeqStackPop(&stack);
 91         //cur指向栈顶元素的右孩子
 92         cur=cur-rchild;
 93     }
 94     return ;
 95 }

3. 二叉树后序遍历(非递归)

借用栈实现
设置当前节点指针cur,初始为根节点的指针,定义一个存储上一个访问结点的指针pre,初始为NULL,

1当cur不为空,入栈,cur指向左孩子,循环直到cur为空
2取栈顶元素如果为空则遍历结束
3如果cur的右孩子为空或者右孩子与上一次节点相同
则访问栈顶元素,出栈,将pre置为top
4cur指向栈顶元素的右孩子
5循环2-4

109 void TreeLater(TreeNode* root)
110 {
111     if(root==NULL)
112     {
113         return ;
114     }
115 
116     //定义一个栈
117     SeqStack stack;
118     //栈的初始化
119     SeqStcakInit;
120     //定义指针变量cur指向root
121     TreeNode* cur=root;
122     //指针pre为存储上一次访问的节点
123     TreeNode* pre=NULL;
124 
125     while(1)
126     {
127         while(cur!=NULL)
128         {
129             //入栈cur 
130             SeqStackPush(&stack,cur);
131             //cur指向左孩子
132             cur=cur->lchild;
133         }
134         TreeNode* top=NULL;
135         //取栈顶元素
136         int ret=SeqStackTop(&stack,&top);
137         if(ret==-1)
138         {
139             //如果栈顶元素为空,则遍历结束
140             return ;
141         }
142         //栈顶元素不为空,判断右孩子是为空
143         //或者右孩子是否与上一次节点相同
144         if(top->rchild==NULL||top->rchild==pre)
145         {
146             //访问栈顶元素
147             printf("%c",top->data);
148             //栈顶元素保存到pre里  
149             pre=top;
150             //出栈
151             SeqStackPop(&stack);
152         }
153         else
154         {
155             //cur指向栈顶元素的右孩子
156             cur=top->rchild;
157         }
158     }
159     return ;
160 }   

猜你喜欢

转载自blog.csdn.net/yu876876/article/details/81034084