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 }
- LeetCode144 Binary Tree Preorder Traversal
- Binary Tree Preorder Traversal leetcode144
- leetcode144 Binary Tree Preorder Traversal
- LeetCode144:Binary Tree Preorder Traversal
- LeetCode144-Binary-Tree-Preorder-Traversal
- [leetcode144]Binary Tree Preorder Traversal
- leetcode144 Binary Tree Preorder Traversal
- LeetCode144. Binary Tree Preorder Traversal
- leetcode144. Binary Tree Preorder Traversal
- LeetCode144—Binary Tree Preorder Traversal
- Leetcode144——Binary Tree Preorder Traversal
- Leetcode144: Construct Binary Tree from Preorder and Inorder Traversal
- LeetCode144——Binary Tree Preorder Traversal二叉树先序遍历
- LeetCode144 Binary Tree Preorder Traversal(迭代实现) Java
- LeetCode144 Binary Tree PreOrder Traversal Java题解(递归 迭代)
- Binary Tree Preorder Traversal
- Binary Tree Preorder Traversal
- Binary Tree Preorder Traversal
- Fragment
- 怎样可以很好的将PDF转为Excel格式
- 【已解决】C盘-系统引导盘扩大容量
- UML建模之时序图(Sequence Diagram)
- px和dip和dp
- leetcode144 Binary Tree Preorder Traversal
- Java取当前月的最后一天
- 中国联通沃任意邮箱账户登录(免密码永久控制沃通行证可发私信短信) ---管管侠
- 2015.5.19方程也是类
- 安卓打开浏览器
- Ajax请求和同步请求如何区别
- mysqld和mysqld_safe 有什么区别
- redis配置详解
- 本地机器大小端判断(本机数据存储形式)