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

Binary tree preorder traversal

时间:2017-07-26 00:09:32      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:类型   order   result   add   步骤   方法   bin   返回值   分治   

不同的方法, 递归出口, 加入结果容器的顺序和递归的顺序

遍历

 public ArrayList<Integer> preorderTraversal(TreeNode root) {
        // write your code here
        Stack<TreeNode> stack = new Stack<TreeNode>();
        //找一个容器进行存储
        ArrayList<Integer> preorder = new ArrayList<Integer>();  
        //特殊情况的考虑
        if (root == null) {
            return preorder;
        }
        //利用栈的特性, 每次出一个,进俩子树,先进右后出右
        //栈 非空时表示没有遍历完. 
        //一个节点进站出站一次,没有多余的循环,因此时间复杂度为O(n)
        stack.push(root);
        while (!stack.empty()) {
            TreeNode node = stack.pop();
            preorder.add(node.val);
            if (node.right != null) {
                stack.push(node.right);
            }	
            if (node.left != null) {
                stack.push(node.left);
            }
            
        }
        return preorder;
    }

递归调用:

public ArrayList<Integer> preorderTraversal(TreeNode root) {    
        //返回值类型
        ArrayList<Integer> result = new ArrayList<Integer>();
        //调用递归函数
        traverse(root, result);
        //求得返回值
        return result;
  }
//递归函数没有返回值因此将结果作为参数
    private void traverse(TreeNode root, ArrayList<Integer> result) {
            //递归出口
            if (root == null) {
                return;
            }
            //根据要求操作节点进入返回值的结果 或 容器
            result.add(root.val);
    		//递归左右子树
            traverse(root.left, result);
            traverse(root.right, result);
        }

 

分治法

public ArrayList<Integer> preorderTraversal(TreeNode root) {  
         //定义结果返回类型
         ArrayList<Integer> result = new ArrayList<Integer>();
         //递归出口
         
         if(root == null) {
             //返回结果类型
             return result;
         }
         
         //Divide 
         //将左右子树分别加入结果
         ArrayList<Integer> left = preorderTraversal(root.left);
         ArrayList<Integer> right = preorderTraversal(root.right);
         
         //conquer: 分情况讨论
         //根据要求操作节点进入结果
         result.add(root.val);
         //操作左子树和右子树
         result.addAll(left);
         result.addAll(right);
         //返回结果
         return result;
        }

  分治法的步骤, 递归出口, 先分-> 操作, 再合->操作, 返回

Binary tree preorder traversal

标签:类型   order   result   add   步骤   方法   bin   返回值   分治   

原文地址:http://www.cnblogs.com/apanda009/p/7237024.html

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