二叉树的前,中,后,层序遍历

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);
        }
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值