Skip to content

Commit d737638

Browse files
committed
add traversal btree stack version
1 parent c98948c commit d737638

File tree

1 file changed

+97
-0
lines changed

1 file changed

+97
-0
lines changed
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
/* ==============================================================================
2+
* 功能描述:TraversalTreeUsingStack
3+
* 创 建 者:gz
4+
* 创建日期:2017/4/24 10:39:19
5+
* ==============================================================================*/
6+
using System;
7+
using System.Collections.Generic;
8+
using System.Linq;
9+
using System.Text;
10+
11+
namespace Tree.TreeLib
12+
{
13+
/// <summary>
14+
/// TraversalTreeUsingStack
15+
/// </summary>
16+
public class TraversalTreeUsingStack
17+
{
18+
private Stack<TreeNode> _stack = new Stack<TreeNode>();
19+
//前序遍历
20+
public void PreOrder(TreeNode root)
21+
{
22+
_stack.Clear();
23+
if (root == null)
24+
return;
25+
TreeNode tmp = root;
26+
_stack.Push(tmp);//先访问根节点
27+
while (_stack.Count > 0)
28+
{
29+
if (tmp == null)//左子树为空
30+
tmp = _stack.Peek(); //弹出右子树
31+
visit(_stack.Peek());
32+
_stack.Pop();
33+
if (tmp.right != null)
34+
_stack.Push(tmp.right);
35+
if (tmp.left != null)
36+
_stack.Push(tmp.left);
37+
tmp = tmp.left;//迭代等式
38+
}
39+
}
40+
//中序遍历
41+
//先遍历左孩子,再访问根节点,最后遍历右孩子
42+
public void MidOrder(TreeNode root)
43+
{
44+
_stack.Clear();
45+
if (root == null) return;
46+
_stack.Push(root);
47+
while (_stack.Count > 0)
48+
{
49+
TreeNode tmp = _stack.Peek();
50+
while (tmp != null) //遍历左子树的最孩子,直到为null
51+
{
52+
_stack.Push(tmp.left);
53+
tmp = tmp.left;
54+
}
55+
//可能1 左孩子为null时退出上层循环,但是此时栈顶为null
56+
//可能2 栈顶为null,while直接退出
57+
_stack.Pop(); //一定弹出null
58+
if (_stack.Count == 0) return;
59+
visit(_stack.Peek()); //访问节点
60+
var tmp2 = _stack.Pop();
61+
_stack.Push(tmp2.right);//如果右孩子为null,则null入栈。
62+
}
63+
}
64+
65+
//后序遍历
66+
public void PostOrder(TreeNode root)
67+
{
68+
_stack.Clear();
69+
if (root == null) return;
70+
_stack.Push(root);
71+
TreeNode tmp = root;
72+
while (_stack.Count > 0)
73+
{
74+
if (tmp == null)
75+
{
76+
_stack.Pop();
77+
tmp = _stack.Peek();
78+
continue;
79+
}
80+
if (tmp.right != null)
81+
_stack.Push(tmp.right);
82+
if (tmp.left != null)
83+
_stack.Push(tmp.left);
84+
visit(_stack.Peek());
85+
tmp = _stack.Pop();
86+
}
87+
}
88+
89+
90+
private void visit(TreeNode node)
91+
{
92+
if (node != null)
93+
Console.WriteLine(node.val);
94+
}
95+
96+
}
97+
}

0 commit comments

Comments
 (0)