首页 > 代码库 > [Leetcode][JAVA] Binary Tree Preorder Traversal, Binary Tree Inorder Traversal, Binary Tree Postorder Traversal
[Leetcode][JAVA] Binary Tree Preorder Traversal, Binary Tree Inorder Traversal, Binary Tree Postorder Traversal
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