码迷,mamicode.com
首页 > 编程语言 > 详细

[Leetcode][JAVA] Binary Tree Preorder Traversal, Binary Tree Inorder Traversal, Binary Tree Postorder Traversal

时间:2014-10-04 02:51:25      阅读:285      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   color   io   os   使用   ar   java   

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     }

 

[Leetcode][JAVA] Binary Tree Preorder Traversal, Binary Tree Inorder Traversal, Binary Tree Postorder Traversal

标签:des   style   blog   color   io   os   使用   ar   java   

原文地址:http://www.cnblogs.com/splash/p/4005513.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!