码迷,mamicode.com
首页 > 其他好文 > 详细

Binary Tree & Divide Conquer 完整笔记l

时间:2016-09-22 08:46:51      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:

技术分享

1. 前序遍历 

1.1 前序遍历的非递归的方式

利用stack

  while (!stack.isEmpty()) {

    pop作为根节点;

    根节点加入result list;

    把右边节点加入到stack;

    把左边节点加入到stack;  

  } 

技术分享
 1 public class Solution {
 2     public List<Integer> preorderTraversal(TreeNode root) {
 3         Stack<TreeNode> stack = new Stack<TreeNode>();
 4         List<Integer> preorder = new ArrayList<Integer>();
 5         
 6         if (root == null) {
 7             return preorder;
 8         }
 9         stack.push(root);
10         
11         while(!stack.isEmpty()) {
12             TreeNode current = stack.pop();
13             preorder.add(current.val);
14             if (current.right != null) {
15                 stack.push(current.right);
16             }
17             if (current.left != null) {
18                 stack.push(current.left);
19             }
20         }
21         return preorder;
22     }
23 }
Non-Recursion preorder
1.2 前序遍历的Traverse 递归方式
traverse 到某个节点,把当前的root加入到result list里面, 然后去遍历它的左右儿子。
traverse方式把一个result储存结果的list在遍历的同时传递,一旦有新的点,就加入到result里面。
递归的function不用返回任何值,而是在function里面对传入的值进行更新处理。

技术分享
 1 public class Solution {
 2     public ArrayList<Integer> preorderTraversal(TreeNode root) {
 3         ArrayList<Integer> result = new ArrayList<Integer>();
 4         traverse(root, result);
 5         return result;
 6     }
 7     // 把root为跟的preorder加入result里面
 8     private void traverse(TreeNode root, ArrayList<Integer> result) {
 9         if (root == null) {
10             return;
11         }
12 
13         result.add(root.val);
14         traverse(root.left, result);
15         traverse(root.right, result);
16     }
17 }
traverse

  以上是traverse二叉树的代码

  附上traverse图的version

技术分享
 1 public class Solution {
 2     public List<Integer> preorderTraversal(Node root) {
 3         List<Integer> result = new ArrayList<Integer>();
 4         if (root == null) {
 5             return result;
 6         }
 7         traverse(result, root);
 8         return result;
 9     }
10     private void traverse(List<Integer> result, Node root) {
11         if (root == null) {
12             return;
13         } 
14         //针对于有环的图 还需要visitied queue来判断是否已经visited
15         result.add(root.val);
16         Queue<Node> queue = new Queue<Node>();
17         current = root.child; //假设child存在链表里
18         while (current != null) {
19             queue.add(current);
20             current = current.next;
21         }
22         
23         
24         for (Node current : stack) {
25             traverse(result, current);
26 
27         }
28     }
29 }
traverse图的前序遍历

1.3 前序遍历的 divide and conquer方式

//todo

 

 

技术分享
 1 public class Solution {
 2     private static List<Integer> result;
 3     public List<Integer> preorderTraversal(TreeNode root) {
 4         result = new ArrayList<Integer>();
 5         if (root == null) {
 6             return result;
 7         }
 8         helper (root);
 9         return result;
10     }
11     private void helper(TreeNode root) {
12         if (root == null) {
13             return;
14         }
15         result.add(root.val);
16         helper(root.left);
17         helper(root.right);
18     }
19 }
preorder_divide and conquer v2

 

Binary Tree & Divide Conquer 完整笔记l

标签:

原文地址:http://www.cnblogs.com/jiangchen/p/5894869.html

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