二叉树的中序遍历

给定一个二叉树,返回它的中序 遍历。

示例:

输入: [1,null,2,3]
   1
    \
     2
    /
   3

输出: [1,3,2]

进阶: 递归算法很简单,你可以通过迭代算法完成吗?

通过此题掌握二叉树的中序遍历,掌握Java泛型和栈的运用

题目分析:

二叉树的中序遍历,用递归遍历很容易实现,但如果用迭代算法就有一定的难度;

二叉树的中序遍历,顺序是——“左根右”(左子树,根节点,右子树),对于遍历,我们从根结点开始,访问到根结点时,此时并不需要将根结点入列表,先将它入栈,之后也好根据其peek()函数访问到根结点的右孩子;接下来我们希望一直访问到的是左子树,并将左孩子入列表;右子树是最后访问到的。

代码实现:

非递归:

public static class TreeNode
{
   int data;
   TreeNode left;
   TreeNode right;

   TreeNode(int val)
   {
       data = val;
   }
}

/**
*非递归
*/
public List<Integer> inorderTraversal(TreeNode root)
{
   List<Integer> list = new ArrayList<>();
   Stack<TreeNode> stack = new Stack<>();

   while (root != null || !stack.isEmpty())
   {
       while (root != null)
       {
           stack.push(root);
           root = root.left;
       }

       if (!stack.isEmpty())
       {
           list.add(stack.peek().data);
           root = stack.peek().right;
           stack.pop();
       }
   }

   return list;
}

算法分析:

以主函数中构造的二叉树P为例:

    1
   / \
  2   3
 / \   \
4   5   6
  1. 进入while循环,根结点不为空;将根节点1入栈,root = root.left,root = 2;
  2. root非空,将节点2入栈;root = 4;
  3. root非空,将节点4入栈;root = root.left = null;此时栈中的状态为:1,2,4
  4. 栈非空,将栈顶元素4入列表,list = [4];root等于节点4的右孩子,为空,将节点4出栈,此时栈中的状态为:1,2;
  5. 栈非空,继续while循环;将栈顶元素2入列表,list = [4,2];root等于节点2的右孩子5,root = 5,将节点2出栈,此时栈中的状态为:1;
  6. root非空,将节点5入栈,此时栈中的状态为:1,5;root等于节点5的左孩子,root = null;栈非空,将栈顶元素5入列表,list = [4,2,5],root等于节点5的右孩子,为空,将节点5出栈,此时栈中的状态为:1;
  7. 栈非空,继续while循环;将栈顶元素1入列表,list = [4,2,5,1],root等于节点1的右孩子3,root = 3,将节点1出栈;
  8. root非空,将节点3入栈,root等于节点3的左孩子,root = null,此时栈中的状态为:3;栈非空,将栈顶元素3入列表,list = [4,2,5,1,3],root等于节点3的右孩子6,root = 6,将节点3出栈;
  9. root非空,将节点6入栈,此时栈中的状态为:6;root等于节点6的左孩子,root = null;栈非空,将栈顶元素6入列表,list = [4,2,5,1,3,6],root等于节点6的右孩子,root = null,将节点6出栈;
  10. root为空,栈为空,结束while循环;
  11. 最后返回的结果就是: [4,2,5,1,3,6]

递归:

/**
* 递归
*/
public List<Integer> inorderTraversal(TreeNode root)
{
   List<Integer> list = new ArrayList<>();

   if (root == null)
       return list;

   inorder(root,list);

   return list;
}

public static void inorder(TreeNode root, List list)
{
   if (root != null)
   {
       inorder(root.left,list);
       list.add(root.data);
       inorder(root.right,list);
   }

}

主函数:

public static void main(String[] args)
{
   TreeNode p = new TreeNode(1);
   p.left = new TreeNode(2);
   p.right = new TreeNode(3);
   p.left.left = new TreeNode(4);
   p.left.right = new TreeNode(5);
   p.right.right = new TreeNode(6);

   Tree13 t = new Tree13();

   List<Integer> list = t.inorderTraversal(p);
   for (int i = 0; i < list.size(); i++)
   {
       System.out.print(list.get(i) + " ");
   }

}

运行结果:

4 2 5 1 3 6

你可能感兴趣的:(数据结构,数据结构与算法2018)