二叉树非递归遍历(C#)
前序:
private void PreTraWithoutRecurtion(TreeNode tn, ListView lv)
{
Stack stack = new Stack();
while(tn.Nodes.Count != 0)
{
lv.Items.Add(tn.Text);
stack.Push(tn);
tn = tn.Nodes[0];
}
lv.Items.Add(tn.Text);
while(stack.Count != 0)
{
tn = (TreeNode)stack.Pop();
if(tn.Nodes.Count > 1)
{
tn = tn.Nodes[1];
while(tn.Nodes.Count != 0)
{
lv.Items.Add(tn.Text);
stack.Push(tn);
tn = tn.Nodes[0];
}
lv.Items.Add(tn.Text);
}
}
}
中序:
private void InTraWithoutRecursion(TreeNode tn, ListView lv)
{
Stack stack = new Stack();
while(tn.Nodes.Count != 0)
{
stack.Push(tn);
tn = tn.Nodes[0];
}
lv.Items.Add(tn.Text);
while(stack.Count != 0)
{
tn = (TreeNode)stack.Pop();
lv.Items.Add(tn.Text);
if(tn.Nodes.Count > 1)
{
tn = tn.Nodes[1];
while(tn.Nodes.Count != 0)
{
stack.Push(tn);
tn = tn.Nodes[0];
}
lv.Items.Add(tn.Text);
}
else if(stack.Count != 0)
{
tn = (TreeNode)stack.Pop();
lv.Items.Add(tn.Text);
if(tn.Nodes.Count >1)
{
tn = tn.Nodes[1];
while(tn.Nodes.Count != 0)
{
stack.Push(tn);
tn = tn.Nodes[0];
}
lv.Items.Add(tn.Text);
}
}
}
}
后序待续。。。
后序来了:
其实感觉所谓程序就是解决问题思路的“再现”,怎么想的怎么写基本上就差不多了,所以关键怎么想...
always thinking....
/// <summary>
/// 非递归后序遍历二叉树
/// 注:在语句上方的注释为其下面的程序块的说明
/// 在语句后面的为该语句的说明
/// =Color.Red 表示从右进入
/// =Color.Lavender表示从左进入
/// ==Color.Red 表示从右回来
/// </summary>
/// <param name="tn">当前子树的根</param>
/// <param name="lv">保存结果的列表</param>
private void PostTraWithoutRecursion(TreeNode tn, ListView lv)
{
Stack stack = new Stack();
//找到最左下节点
while(tn.Nodes.Count != 0)
{
tn.BackColor = Color.Lavender;
stack.Push(tn);
tn = tn.Nodes[0];
}
tn.BackColor = Color.Red;
lv.Items.Add(tn.Text);
tn.BackColor = Color.Empty;
//开始其他节点访问
while(true)
{
//指向栈顶节点
if(stack.Count != 0)
tn = (TreeNode)stack.Peek();
else
return;
//访问从右子节点回来的点
while(tn.BackColor == Color.Red)
{
lv.Items.Add(tn.Text);
tn.BackColor = Color.Empty;
stack.Pop();//访问完毕弹出
if(stack.Count != 0)//指向栈顶节点
{
tn = (TreeNode)stack.Peek();
}
else
return;
}
//从右子节点进入
tn.BackColor = Color.Red;
if(tn.Nodes.Count > 1)
{
tn = tn.Nodes[1];//指向右子节点
//找到右子节点的最左下节点
while(tn.Nodes.Count != 0)
{
tn.BackColor = Color.Lavender;
stack.Push(tn);
tn = tn.Nodes[0];
}
//访问最左下
tn.BackColor = Color.Red;
lv.Items.Add(tn.Text);
tn.BackColor = Color.Empty;
}
//没有右子节点,访问之
else
{
lv.Items.Add(tn.Text);
tn.BackColor = Color.Empty;
stack.Pop();
}
}
}