二叉树前序、中序、后序、层序遍历执行步骤分析


 

public class TreeNode<T> {

    public  TreeNode left;

    public  TreeNode right;

    public T val;

    public TreeNode(T val) {
        this.val = val;
    }

    public TreeNode() {
    }

    public static TreeNode get(){
        TreeNode<Integer> root =new TreeNode<>(5);
        root.left = new TreeNode<>(3);
        root.left.left = new TreeNode<>(2);
        root.left.right = new TreeNode<>(4);
        root.left.left.left = new TreeNode<>(1);
        root.left.left.left.left = new TreeNode<>(0);
        root.right = new TreeNode<>(7);
        root.right.right = new TreeNode<>(8);
        root.right.left = new TreeNode<>(6);
        return root;
    }
}
 //前序、中序遍历
 public static void preOrderNonRecursive(TreeNode<Integer> root){
	Stack<TreeNode<Integer>> stack = new Stack<>();
	while (true){
		while (root != null){
			stack.push(root);
			//前序输出
			//System.out.print(root.val+"\t");
			root = root.left;
		}
		if(stack.isEmpty()) break;
		root = stack.pop();
		System.out.print(root.val+"\t");//中序输出
		root = root.right;
	}
 }
前序遍历:前序先输出根节点,再输出左子节点,最后输出右子节点。                                                                                   输出结果: 5 3 2 1 0 4 7 6 8

中序遍历:中序先输出左子节点,在输出根节点,最后访问右节点                                                                                            输出结果:0 1 2 3 4 5 6 7 8

//前序、中序遍历步骤:

1)将根结点5放入栈中,取出左节点3作为根节点  栈中(5)
2)将根结点3放入栈中,取出左节点2作为根节点 栈中(5,3)
3)将根结点2放入栈中,取出左节点1作为根节点 栈中(5,3,2)
4)将根结点1放入栈中,取出左节点0作为根节点 栈中(5,3,2,1)
5)将根结点0放入栈中,取出左节点null作为根节点 栈中(5,3,2,1,0)
6)将0节点从栈中删除,取出右节点null做为根节点 栈中(5,3,2,1)
7)将1节点从栈中删除,取出右节点null做为根节点 栈中(5,3,2)
8)将2节点从栈中删除,取出右节点null做为根节点 栈中(5,3)
9)将3节点从栈中删除,取出右节点4做为根节点 栈中(5)
10)将根结点4放入栈中,取出左节点null作为根节点 栈中(5,4)
11)将4节点从栈中删除,取出右节点null做为根节点 栈中(5)
12)将5节点从栈中删除,取出右节点7做为根节点 栈中()
13)将根结点7放入栈中,取出左节点6作为根节点 栈中(7)
14)将根结点6放入栈中,取出左节点null作为根节点 栈中(7,6)
15)将6节点从栈中删除,取出右节点null做为根节点 栈中(7)
16)将7节点从栈中删除,取出右节点8做为根节点 栈中()
17)将根节点8放入栈中,取出左节点null作为根节点 栈中(8)
18)将8节点从栈中删除,取出右节点null做为根节点 栈中()
19)跳出循环


 //后序遍历
  public static void thePostOrderTraversal_Stack(TreeNode root) {  
        Stack<TreeNode> stack = new Stack<>();
        Stack<TreeNode> output = new Stack<>();//构造一个中间栈来存储逆后序遍历的结果
        TreeNode node = root;
        while (node != null || stack.size() > 0) {
            if (node != null) {
                output.push(node);
                stack.push(node);
                node = node.right;
            } else {
                node = stack.pop();
                node = node.left;
            }
        }
        System.out.println(output.size());
        while (output.size() > 0) {
            System.out.print(output.pop().val +"\t");
        }
    }

后序遍历:先输出左子节点,再输出右子节点,最后输出根节点  0 1 2 4 3 6 8 7 5

后序遍历步骤:
1)将根结点5放入栈中,取出右节点7作为根节点 output栈中(5)      栈中(5) 
2)将根节点7放入栈中,取出右节点8作为根节点 output栈中(5,7)       栈中(5,7)
3)将根节点8放入栈中,取出右节点null作为根节点放入栈中       output栈中(5,7,8)         栈中(5,7,8)
4)将8节点从栈中删除,将8左节点null作为根节点     栈中(5,7)
5)将7节点从栈中删除,将7左节点6作为根节点    栈中(5)
6)将根节点6放入栈中,取出右节点null作为根节点            output栈中(5,7,8,6)    栈中(5,6)
7)将6节点从栈中删除,将6做节点null做为根节点     栈中(5)
8)将5节点从栈中删除,将左节点3作为根节点            栈中()
9)将根节点3放入栈中,取出右节点4作为根节点  output栈中(5,7,8,6,3)    栈中(3)
10)将根节点4放入栈中,取出右节点null作为根节点          output栈中(5,7,8,6,3,4)       栈中(3,4)
11)将根节点4从栈中删除,取出左节点null作为根节点     栈中(3)
12)将根节点3从栈中删除,取出左节点2作为根节点      栈中()
13)将根节点2放入栈中,取出右节点null作为根节点 output栈中(5,7,8,6,3,4,2)     栈中(2)
14)将根节点2从栈中删除,取出左节点1作为根节点              栈中(1)
15)将根节点1放入栈中,取出右节点null作为根节点 output栈中(5,7,8,6,3,4,2,1)   栈中(1)
16)将根节点1从栈中删除,取出左节点0作为根节点       栈中(0)
15)将根节点0放入栈中,取出右节点null作为根节点 output栈中(5,7,8,6,3,4,2,1,0) 栈中(0)
16)将根节点0从栈中删除,取出左节点null作为根节点        栈中()

17)跳出循环

//层序遍历
	public static int treeDepth(TreeNode<Integer> root){
        if(root==null){
            return 0;
        }
        Queue<TreeNode<Integer>> queue = new LinkedList<>();
        queue.offer(root);
        int depth = 0;
        while (!queue.isEmpty()){
            int size = queue.size();
            TreeNode<Integer> cur;
            for(int i=0;i<size;i++){
                cur = queue.poll();
                System.out.print(cur.val +"\t");
                if(cur.left != null){
                    queue.offer(cur.left);
                }
                if(cur.right != null){
                    queue.offer(cur.right);
                }
            }
            depth++;
        }
        return depth;
    }
//层序遍历:先访问树的第一层,再访问第二层节点....一直到访问最下面一层节点。在同一层节点中,以从左到右的顺序依次访问。   
   输出结果:5 3 7 2 4 6 8 1 0


层序遍历步骤:
   1)将5节点从栈中删除,将5节点的左节点3、右节点7放入队列(3,7)
   2)将3节点从队列删除,将3节点的左节点2、右节点4放入队列(7,2,4)
   3)将7节点从队列删除,将7节点的左节点6、右节点8放入队列(2,4,6,8)
   4)将2节点从队列删除,将2节点的左节点1放入队列(4,6,8,1)
   5)将4节点从队列删除(6,8,1)
   6)将6节点从队列删除(8,1)
   7)将8节点从队列删除(1)
   8)将1节点从队列删除,将1节点的左节点0放入队列(0)
   9)将0节点从队列删除()
   10)跳出循环

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值