leetcode144 Binary Tree Preorder Traversal

来源:互联网 发布:navicat怎么连接mysql 编辑:程序博客网 时间:2024/05/01 21:58

Binary Tree PreOrder Traversal:

Given a binary tree, return the  preorder  traversal of its nodes' values.

For example:

Given binary tree  {1,#,2,3} ,

   1    \     2    /   3

 

return  [1,2,3] .

Note: Recursive solution is trivial, could you do it iteratively?

不使用递归前序遍历,可以借助栈的帮助实现。对于一个特定节点,前序遍历顺序为: 根,左,右。所以入栈顺序为 右,左,根。由于根节点的遍历和展开(研究其右节点和左节点)是同时的,所以根节点出栈的同时即可加入遍历结果中,然后研究其右节点和左节点,如果不为空即可入栈。

 1  public List<Integer> preorderTraversal(TreeNode root) { 2         List<Integer> ls = new ArrayList<Integer>(); 3         if(root==null) 4             return ls; 5         Stack<TreeNode> st = new Stack<TreeNode>(); 6         st.push(root); 7          8         while(!st.isEmpty()) 9         {10             TreeNode temp = st.pop();11             ls.add(temp.val);12             if(temp.right!=null)13                 st.push(temp.right);14             if(temp.left!=null)15                 st.push(temp.left);16         }17         return ls;18     }

Binary Tree Inorder Traversal

Given a binary tree, return the  inorder  traversal of its nodes' values.

For example:

Given binary tree  {1,#,2,3} ,

   1    \     2    /   3

 

return  [1,3,2] .

Note: Recursive solution is trivial, could you do it iteratively?

中序遍历比前序遍历复杂一些,主要是需要区分得到的节点是需要展开还是直接遍历。一般来说第一次访问节点则展开,并且自己重新入栈,第二次从栈中访问到则计入遍历。这里采用HashSet来判断是否已经访问过。

压栈顺序为 右, 根, 左(因为中序遍历顺序为左 根 右)

 1 public List<Integer> inorderTraversal(TreeNode root) { 2         List<Integer> ls = new ArrayList<Integer>(); 3         if(root==null) 4             return ls; 5         Stack<TreeNode> st = new Stack<TreeNode>(); 6         HashSet<TreeNode> hs = new HashSet<TreeNode>(); 7          8         st.push(root); 9         while(!st.isEmpty())10         {11             TreeNode temp = st.pop();12             if(hs.contains(temp))13             {14                 ls.add(temp.val);15                 continue;16             }17             hs.add(temp);18             if(temp.right!=null)19                 st.push(temp.right);20             st.push(temp);21             if(temp.left!=null)22                 st.push(temp.left);23         }24         return ls;25     }

Binary Tree Postorder Traversal

Given a binary tree, return the  postorder  traversal of its nodes' values.

For example:

Given binary tree  {1,#,2,3} ,

   1    \     2    /   3

 

return  [3,2,1] .

Note: Recursive solution is trivial, could you do it iteratively?

与中序遍历一样,只不过压栈顺序为根,右,左(后序遍历顺序为左,右,根)

 1 public List<Integer> postorderTraversal(TreeNode root) { 2         List<Integer> ls = new ArrayList<Integer>(); 3         if(root==null) 4             return ls; 5         Stack<TreeNode> st = new Stack<TreeNode>(); 6         HashSet<TreeNode> hs = new HashSet<TreeNode>(); 7          8         st.push(root); 9         while(!st.isEmpty())10         {11             TreeNode temp = st.pop();12             if(hs.contains(temp))13             {14                 ls.add(temp.val);15                 continue;16             }17             hs.add(temp);18             st.push(temp);19             if(temp.right!=null)20                 st.push(temp.right);21             if(temp.left!=null)22                 st.push(temp.left);23         }24         return ls;25     }
0 0