二叉树中序遍历迭代代码理解

二叉树中序遍历迭代
public void inorderTraversal(TreeNode root, Stack<TreeNode> stack){
        
        while(root!=null || !stack.isEmpty()){
            
            while(root!=null){
                stack.push(root);
                root=root.left;
            }
            
            if(!stack.isEmpty()){
                root = stack.pop();
                System.out.print(root.data+"  ");
                root = root.right;
            }

        }

    }
代码分析
  1. 首先我们知道while循环条件中会包含root结点,理解root结点在while循环中代表的意义显得至关重要。
    条件中的roo结点表示,循环将会对以root为根结点的树进行处理
			while(root!=null){
                stack.push(root);
                root=root.left;
            }
  1. while循环体内会有这样一个循环,它表示我们在以root为根结点的树进行处理时,把这棵树包含root结点在内的所有左子结点压入栈内
    二叉树中序遍历迭代代码理解_第1张图片

  2. 当我们处理到最后一个左子结点d时,
    在这个while循环中root就代表d结点,它没有左子结点,我们应输出它,使其出栈。
    重点在于处理完以d为根结点的树后,下一棵要处理的树的根结点应该是d的右子结点,因为如果它有右子结点,那么以右子结点为根结点的树会在d之后输出。如果没有右子结点,那么下一棵要处理的树应该是d的父结点,也就是此时存储在栈顶的结点。

  3. 自底向上把以每一个左子结点为根结点的树处理完,这样当处理到栈底的整棵树的root结点时,左子树已经全部输出,下一棵树定位到root的右子结点,处理root的右子树。
    二叉树中序遍历迭代代码理解_第2张图片

你可能感兴趣的:(算法)