public class TreeNode
{
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val)
{
this.val = val;
}
}
1.前序遍历
递归版:
public void PreOrde(TreeNode root)
{
if(root==null)
{
return;
}
WriteLine(root.val);
Head(root.left);
Head(root.right);
}
非递归版:
public void PreOrde(TreeNode root)
{
if(root==null)
{
return;
}
Stack<TreeNode> stack = new Stack<TreeNode>();
while (stack.Count != 0 || root != null)
{
if (root != null)
{
WriteLine(root.val);
stack.Push(root);
root = root.left;
}
else
{
root = stack.Pop();
root = root.right;
}
}
}
2.中序遍历
递归版:
public void InOrder(TreeNode root)
{
if(root==null)
{
return;
}
Middle(root.left);
WriteLine(root.val);
Middle(root.right);
}
非递归版:
public void InOrder(TreeNode root)
{
if(root==null)
{
return;
}
Stack<TreeNode> stack = new Stack<TreeNode>();
while (stack.Count != 0 || root != null)
{
if (root != null)
{
stack.Push(root);
root = root.left;
}
else
{
root = stack.Pop();
WriteLine(root.val);
root = root.right;
}
}
}
3.后序遍历
递归版:
public void PostOrder(TreeNode root)
{
if(root==null)
{
return;
}
PostOrder(root.left);
PostOrder(root.right);
WriteLine(root.val);
}
非递归版:
使用辅助栈,前序遍历反过来
public void PostOrder(TreeNode root)
{
if(root==null)
{
return;
}
Stack<TreeNode> stack1 = new Stack<TreeNode>();
Stack<TreeNode> stack2 = new Stack<TreeNode>();
while(root!=null || stack1.Count!=0)
{
while(root!=null)
{
stack2.Push(root);
stack1.Push(root);
root = root.right;
}
if(stack1.Count!=0)
{
root = stack1.Pop();
root = root.left;
}
}
while(stack2.Count!=0)
{
root = stack2.Pop();
WriteLine(root.val);
}
}
使用一个结点pre来标记是否访问过
public void Tail(TreeNode root)
{
if(root==null)
{
return;
}
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode pre=null, cur = root;
while(cur!=null)
{
stack.Push(cur);
cur = cur.left;
}
while(stack.Count!=0)
{
cur = stack.Pop();
if(cur.right==null || cur.right==pre) //当右子树已经访问过或者右子树为空,才可以访问根节点
{
WriteLine(cur.val);
pre = cur;
}
else
{
stack.Push(cur);
cur = cur.right;
while(cur!=null)
{
stack.Push(cur);
cur = cur.right;
}
}
}
}
4.层序遍历
public void LevelOrder(TreeNode root)
{
if(root==null)
{
return;
}
Queue<TreeNode> que = new Queue<TreeNode>();
que.Enqueue(root);
while(que.Count!=0)
{
TreeNode temp = que.Dequeue();
WriteLine(temp.val);
if(temp.left!=null)
{
que.Enqueue(temp.left);
}
if(temp.right!=null)
{
que.Enqueue(temp.right);
}
}
}