小明思考

          Just a software engineer
          posts - 124, comments - 36, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          二叉樹求和問題

          Posted on 2013-04-16 11:37 小明 閱讀(2546) 評論(1)  編輯  收藏 所屬分類: 數據結構和算法
          問題給定一個二叉樹,每個節點的值是一個數字(0-9),每個從根節點到葉節點均能組成一個數字。
          比如如果從根節點到葉節點的路徑是1-2-3,那么這代表了123這個數字。
          求出所有這樣從根節點到葉節點的數字之和。

          比如,對于二叉樹
            1
           /  \
          2   3

          一共有兩條路徑1->2和1->3,那么求和的結果就是12+13=25
          /**
           * Definition for binary tree
           * public class TreeNode {
           *     int val;
           *     TreeNode left;
           *     TreeNode right;
           *     TreeNode(int x) { val = x; }
           * }
           */
          public class Solution {
              public int sumNumbers(TreeNode root) {
                  //write code here
              }
          }

          分析:
          此問題不難,主要是一個深度優先算法,使用了一個stringbuffer記錄當前的路徑,每次找到一個葉節點,就記下當前的值。當返回到上一層節點,注意要刪除最后一次用來回朔。

          代碼如下:

          public class SumTreeNodes {
              
              class TreeNode {
                    int val;
                    TreeNode left;
                    TreeNode right;
                    TreeNode(int x) { val = x; }
              }
              
              StringBuffer current = new StringBuffer();
              int sum = 0;
              
              private void dfs(TreeNode node){
                  int val = node.val;
                  current.append(val+"");
                  if(node.left==null && node.right==null){ //leaf here
                      sum += Integer.parseInt(current.toString());
                  }
                  else{
                      if(node.left!=null){
                          dfs(node.left);
                          current.setLength(current.length()-1);
                      }
                      if(node.right!=null){
                          dfs(node.left);
                          current.setLength(current.length()-1);
                      }
                  }
              }
              
               public int sumNumbers(TreeNode root) {
                   sum = 0;
                   current.setLength(0);
                   if(root!=null){
                       dfs(root);
                   }
                   return  sum;
               }
          }








          評論

          # re: 二叉樹求和問題[未登錄]  回復  更多評論   

          2013-04-17 11:08 by Harry
          object TreeVisitor {
          trait Monoid[A] {
          def mempty: A
          def mappend(a: A, b: A): A
          }
          implicit object IntMonoid extends Monoid[Int] {
          def mempty = 0
          def mappend(a: Int, b: Int) = a * 10 + b
          }
          implicit object StringMonoid extends Monoid[String]{
          def mempty = ""
          def mappend(a:String,b:String) = a+b
          }

          trait Tree[A]
          case class TreeNode[A](n: A, left: Tree[A], right: Tree[A]) extends Tree[A]
          case class Leaf[A](num: A) extends Tree[A]

          def visitTree[A: Monoid](t: Tree[A], path: A): List[A] = {
          val ev = implicitly[Monoid[A]]
          t match {
          case TreeNode(n, left, right) =>
          visitTree(left, ev.mappend(path, n)) ++ visitTree(right, ev.mappend(path, n))
          case Leaf(num) => List(ev.mappend(path, num))
          }
          }
          def main(args: Array[String]): Unit = {
          val t1 = TreeNode(10, Leaf(7), Leaf(8))
          val t2 = TreeNode(200, t1, Leaf(9))
          val t3 = TreeNode(3000, t2, t2)
          val t4 = TreeNode(40000, t3, t2)
          val sumt = visitTree(t4,0).sum
          println(sumt)
          val s1 = TreeNode("1",Leaf("2"),Leaf("3"))
          val s2 = TreeNode("2",s1,Leaf("4"))
          val sums = visitTree(s2,"") map {x=>x.toInt}
          println(sums.sum)


          }

          }
          主站蜘蛛池模板: 余庆县| 建平县| 武穴市| 工布江达县| 团风县| 宜春市| 隆德县| 阜平县| 额尔古纳市| 婺源县| 綦江县| 正定县| 文成县| 平山县| 新乐市| 酉阳| 阿拉善左旗| 盘山县| 余姚市| 天全县| 洪雅县| 博湖县| 彝良县| 裕民县| 绥宁县| 大田县| 江都市| 富蕴县| 佛冈县| 宝清县| 昌平区| 丘北县| 木里| 黄冈市| 冕宁县| 辽源市| 平邑县| 阿合奇县| 大城县| 福鼎市| 婺源县|