C#先序遍历2叉树(非递归)

找了下先序遍历二叉树C# 实现貌似没有 顺手些了一个

大致思路是:

传入根节点,然后依次循环其子节点推入到栈中,

当推入的节点没有子节点的时候(叶子)或者所有子节点均已经遍历过后(上一次遍历的节点是该节点的右子节点),再依次退出栈。

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication5
{
class Program
{
static void Main(string[] args)
{
Node treeRoot = CreateTree();
scanTree(treeRoot);
} private static void scanTree(Node treeRoot)
{
List<Node> list = new List<Node>();
list.Add(treeRoot);
Node point = treeRoot;
Write(treeRoot);
while (true)
{
if (!list.Contains(point))
{ //上一轮是移除的操作
if (treeRoot.leftSon == point)
{//移除的是左结点
if (treeRoot.rightSon != null)
{
treeRoot = treeRoot.rightSon;
list.Add(treeRoot);
Write(treeRoot);
point = treeRoot;
continue;
}
list.Remove(treeRoot);
if (list.Count == )
{
break;
}
point = treeRoot;
treeRoot = list[list.Count - ];
}
else
{//移除的是右结点
list.Remove(treeRoot);
if (list.Count == )
{
break;
}
point = treeRoot;
treeRoot = list[list.Count - ];
}
continue;
} if (treeRoot.leftSon != null)
{
treeRoot = treeRoot.leftSon;
Write(treeRoot);
list.Add(treeRoot);
point = treeRoot;
continue;
}
if (treeRoot.rightSon != null)
{
treeRoot = treeRoot.rightSon;
Write(treeRoot);
point = treeRoot;
list.Add(treeRoot);
continue;
}
//当前的节点是叶子节点 if (treeRoot.leftSon == null && treeRoot.rightSon == null)
//{
list.Remove(treeRoot);
if (list.Count == )
{
break;
}
point = treeRoot;
treeRoot = list[list.Count - ];
// }
} } public static void Write(Node node)
{
Console.WriteLine(node.Data);
} private static Node CreateTree()
{
Node a = new Node("A");
a.leftSon = new Node("B");
a.rightSon = new Node("C"); a.leftSon.leftSon = new Node("D");
a.leftSon.rightSon = new Node("E"); a.rightSon.leftSon = new Node("F");
a.rightSon.rightSon = new Node("G"); a.leftSon.leftSon.leftSon = new Node("H");
a.leftSon.leftSon.rightSon = new Node("I");
return a;
}
} class Node
{
public string Data { get; set; }
public Node leftSon { get; set; }
public Node rightSon { get; set; } public Node(string data)
{
Data = data;
}
}
}
上一篇:如何在windows“我的电脑”中添加快捷文件夹


下一篇:Android Paint类方法说明