zoukankan      html  css  js  c++  java
  • 129. Sum Root to Leaf Numbers

    题目:

    Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number.

    An example is the root-to-leaf path 1->2->3 which represents the number 123.

    Find the total sum of all root-to-leaf numbers.

    For example,

        1
       / 
      2   3
    

    The root-to-leaf path 1->2 represents the number 12.
    The root-to-leaf path 1->3 represents the number 13.

    Return the sum = 12 + 13 = 25.

    代码:

    作为第一个做的Medium级别的题目,还是有点困难的。

    关键两步都参考了百度:1. 递归的方式创建一颗二叉树(用来测试);2. 递归的方式深度优先遍历二叉树并求和。

     1. 递归的方式创建一颗二叉树(用来测试):

    递归方法简历二叉树,就不多说了,有兴趣去调试一下,一目了然。

    public TreeNode(int[] array){
            root=makeBinaryTreeByArray(array,1);
        }

        /**
         * 采用递归的方式创建一颗二叉树
         * 传入的是二叉树的数组表示法
         * 构造后是二叉树的二叉链表表示法
         */
        public static TreeNode makeBinaryTreeByArray(int[] array,int index){
    //        System.out.print("递归建树数组剩余: "+index+array.length);
            if(index<array.length){
                int value=array[index];
    //            if(array[index]!=0){
                    TreeNode t=new TreeNode(value);
                    array[index]=0;
                    t.left=makeBinaryTreeByArray(array,index*2);
                    t.right=makeBinaryTreeByArray(array,index*2+1);
                    return t;
    //            }
            }
            return null;
        }

    2. 递归的方式深度优先遍历二叉树并求和:

    从root节点开始,调用sumNumbers(),首先将root的值计入变量tmpsum。

    如果左子树不为空,以左子树节点为参数,递归调用sumNumbers()函数,此时第一次记录root的值*10加上该节点的值。

    左子树优先处理,所以会一直调用完,相当于深度优先遍历,组合出全部左树的结果。

    左子树处理之后就回去遍历右子树,每次都是先左后右。

    如果右子树不为空,同样以右子树节点为参数,递归调用sumNumbers()函数,此时第一次记录root的值*10加上该节点的值。

    某个节点左右子树都未空时,说明当前已经是最下层节点了,于是*10+val生成本条路径的tmpsum,之后加入变量result中。

    解释了这么多,肯定还是懵逼,自己去画一个二叉树,试一试就发现,是这个样子滴!

        int result;
        public int sumNumbers(TreeNode root) {
            if(root==null){
                System.out.println("empty tree");
             return 0;
             }
            result =0 ;
            sumnuber(root,0);
            System.out.print(result);
            return result;
        }    
        public int sumnuber(TreeNode root,int tmpsum) {
             if(root.left == null && root.right == null)  
             {  
                 result += tmpsum * 10 + root.val;  
    //             System.out.print(result+" ");
             }  
             if(root.left != null)  
             {  
                 sumnuber(root.left, tmpsum * 10 + root.val);
             }  
             if(root.right != null)  
             {  
                 sumnuber(root.right, tmpsum * 10 + root.val);  
             }
             return result;
        }   

  • 相关阅读:
    Working with macro signatures
    Reset and Clear Recent Items and Frequent Places in Windows 10
    git分支演示
    The current .NET SDK does not support targeting .NET Core 2.1. Either target .NET Core 2.0 or lower, or use a version of the .NET SDK that supports .NET Core 2.1.
    Build website project by roslyn through devenv.com
    Configure environment variables for different tools in jenkins
    NUnit Console Command Line
    Code Coverage and Unit Test in SonarQube
    头脑王者 物理化学生物
    头脑王者 常识,饮食
  • 原文地址:https://www.cnblogs.com/yuanzhaoyi/p/5857005.html
Copyright © 2011-2022 走看看