zoukankan      html  css  js  c++  java
  • (转)在二元树中找出和为某一值的所有路径,java版本

    摘自:http://www.cnblogs.com/qi09/archive/2011/05/24/2055643.html

    4.在二元树中找出和为某一值的所有路径 
    题目:输入一个整数和一棵二元树。 
    从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。 
    打印出和与输入整数相等的所有路径。 
    例如输入整数22 和如下二元树 
    10 
    /  
    5 12 

    4 7 
    则打印出两条路径:10, 12 和10, 5, 7。 
    二元树节点的数据结构定义为: 
    struct BinaryTreeNode // a node in the binary tree 

    int m_nValue; // value of node 
    BinaryTreeNode *m_pLeft; // left child of node 
    BinaryTreeNode *m_pRight; // right child of node 
    }; 

    Java代码  收藏代码
    1. /** 
    2.  *  
    3.  */  
    4. package com.lhp;  
    5.   
    6. import java.util.ArrayList;  
    7. import java.util.List;  
    8.   
    9. /** 
    10.     4.在二元树中找出和为某一值的所有路径 
    11.     题目:输入一个整数和一棵二元树。 
    12.     从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。 
    13.     打印出和与输入整数相等的所有路径。 
    14.     例如输入整数22 和如下二元树 
    15.     10 
    16.     /  
    17.     5 12 
    18.     / 
    19.     4 7 
    20.     则打印出两条路径:10, 12 和10, 5, 7。 
    21.     二元树节点的数据结构定义为: 
    22.     struct BinaryTreeNode // a node in the binary tree 
    23.     { 
    24.     int m_nValue; // value of node 
    25.     BinaryTreeNode *m_pLeft; // left child of node 
    26.     BinaryTreeNode *m_pRight; // right child of node 
    27.     }; 
    28.  */  
    29.    
    30. /** 
    31.  * 二叉树 
    32.  */  
    33. class BinaryTree {  
    34.     private BinaryTreeNode root;    // 根  
    35.   
    36.     public BinaryTreeNode getRoot() {  
    37.         return root;  
    38.     }  
    39.   
    40.     public void setRoot(BinaryTreeNode root) {  
    41.         this.root = root;  
    42.     }  
    43.       
    44.     /** 
    45.      * 增加子节点 
    46.      * @param 节点 
    47.      */  
    48.     public synchronized void addNode(BinaryTreeNode node) {  
    49.         if (null == this.root) {  
    50.             this.root = node;  
    51.             return;  
    52.         }  
    53.           
    54.         BinaryTreeNode tempNode = this.root;  
    55.           
    56.         while (true) {  
    57.             if (node.getM_nValue() > tempNode.getM_nValue()) {   // 大于父节点  
    58.                 if (null == tempNode.getM_pRight()) {  
    59.                     tempNode.setM_pRight(node);  
    60.                     return;  
    61.                 } else {  
    62.                     tempNode = tempNode.getM_pRight();  
    63.                     continue;  
    64.                 }  
    65.             } else if (node.getM_nValue() < tempNode.getM_nValue()) {    // 小于父节点  
    66.                 if (null == tempNode.getM_pLeft()) {  
    67.                     tempNode.setM_pLeft(node);  
    68.                     return;  
    69.                 } else {  
    70.                     tempNode = tempNode.getM_pLeft();  
    71.                     continue;  
    72.                 }  
    73.             } else {    // 等于父节点  
    74.                 return;  
    75.             }  
    76.         }  
    77.     }  
    78.       
    79.     /** 
    80.      * 输出指定路径和大小的所有路径 
    81.      * @param 路径的和 
    82.      */  
    83.     public synchronized void printSumPath(int sumValue) {  
    84.         printSumPath(this.root, new ArrayList<Integer>(), 0, sumValue);  
    85.     }  
    86.       
    87.     /** 
    88.      * @param 节点 
    89.      * @param 路径存储集合 
    90.      * @param 临时路径的和 
    91.      * @param 路径的和 
    92.      */  
    93.     private void printSumPath(BinaryTreeNode node, List<Integer> path, int tempSum, int sumValue) {  
    94.         if (null == node) {  
    95.             return;  
    96.         }  
    97.           
    98.         tempSum += node.getM_nValue();  
    99.         path.add(node.getM_nValue());  
    100.           
    101.         boolean isLeaf = (null == node.getM_pLeft() && null == node.getM_pRight()); // 是否为叶子  
    102.           
    103.         if (isLeaf && tempSum == sumValue) {    // 满足  
    104.             System.out.print("sumPath(" + sumValue + "): ");  
    105.             for (int i : path) {  
    106.                 System.out.print(i + " ");  
    107.             }  
    108.             System.out.println();  
    109.         }  
    110.           
    111.         // 《向左走,向右走》 :-)  
    112.         printSumPath(node.getM_pLeft(), path, tempSum, sumValue);  
    113.         printSumPath(node.getM_pRight(), path, tempSum, sumValue);  
    114.           
    115.         // 保证递归完成后返回父节点时路径是根结点到父节点的路径,之后遍历父节点的其他子节点,没有则返回到爷爷节点...  
    116.         path.remove(path.size() - 1);   // 删除当前节点  
    117.         // 最后补充一下,如果path不是指针而是基本类型的话,这句话就没用了(放在递归调用下面就没用了),算法也废了,比如在这里加入一句tempSum+=XXX;对结果没有任何影响,不会影响递归return时其他函数里的参数  
    118.     }  
    119.       
    120.     /** 
    121.      * 打印前序遍历 
    122.      */  
    123.     public synchronized void print() {  
    124.         if (null == this.root) {  
    125.             System.out.print("HashCode: " + this.hashCode() +  "; 空树;");  
    126.             return;  
    127.         }  
    128.         System.out.print("HashCode: " + this.hashCode() +  "; 树: ");  
    129.         print(this.root);  
    130.         System.out.println();  
    131.     }  
    132.       
    133.     private void print(BinaryTreeNode node) {  
    134.         if (null != node) {  
    135.             System.out.print(node.getM_nValue() + " ");  
    136.             print(node.getM_pLeft());  
    137.             print(node.getM_pRight());  
    138.         }  
    139.     }  
    140. }  
    141.   
    142. /** 
    143.  * 节点 
    144.  */  
    145. class BinaryTreeNode {  
    146.     private int m_nValue; // value of node  
    147.     private BinaryTreeNode m_pLeft; // left child of node  
    148.     private BinaryTreeNode m_pRight; // right child of node  
    149.       
    150.     BinaryTreeNode(int value) {  
    151.         this.m_nValue = value;  
    152.     }  
    153.       
    154.     public int getM_nValue() {  
    155.         return m_nValue;  
    156.     }  
    157.     public void setM_nValue(int mNValue) {  
    158.         m_nValue = mNValue;  
    159.     }  
    160.     public BinaryTreeNode getM_pLeft() {  
    161.         return m_pLeft;  
    162.     }  
    163.     public void setM_pLeft(BinaryTreeNode mPLeft) {  
    164.         m_pLeft = mPLeft;  
    165.     }  
    166.     public BinaryTreeNode getM_pRight() {  
    167.         return m_pRight;  
    168.     }  
    169.     public void setM_pRight(BinaryTreeNode mPRight) {  
    170.         m_pRight = mPRight;  
    171.     }  
    172. }  
    173.   
    174. public class Four {  
    175.     public static void main(String[] args) {  
    176.         BinaryTree tree = new BinaryTree();  
    177.         tree.addNode(new BinaryTreeNode(10));  
    178.         tree.addNode(new BinaryTreeNode(5));  
    179.         tree.addNode(new BinaryTreeNode(12));  
    180.         tree.addNode(new BinaryTreeNode(4));  
    181.         tree.addNode(new BinaryTreeNode(7));  
    182.         tree.addNode(new BinaryTreeNode(9));  
    183.         tree.addNode(new BinaryTreeNode(3));  
    184.         tree.print();  
    185.         tree.printSumPath(22);  
    186.         tree.printSumPath(31);  
    187.     }  
    188. }  
  • 相关阅读:
    PHP chgrp() 函数
    PHP basename() 函数
    PHP user_error() 函数
    PHP trigger_error() 函数
    my.cnf需要改的参数
    WPF 使用 Direct2D1 画图入门
    win10 uwp 如何开始写 uwp 程序
    win10 uwp 如何开始写 uwp 程序
    C# 快速释放内存的大数组
    C# 快速释放内存的大数组
  • 原文地址:https://www.cnblogs.com/antyi/p/4876519.html
Copyright © 2011-2022 走看看