• 二叉树中的和,求路径


    题目描述:已知二叉树和一个确定的值,求二叉树中的路径上节点的和满足给定的值,输出这些路径。

    题目和算法解析:我们知道二叉树中的路径是指从根节点到叶子节点的。一定是从根节点出发的。所以我们需要有一种数据结构能够记录我们走过的路径。想到了栈。算法需要从根节点开始采用  前序遍历的思想逐个去校验是否符合条件。

    算法实现;

     1 #include<iostream>
     2 #include<vector>
     3 using namespace std;
     4 
     5 typedef struct BiTreeNode{
     6     int data;
     7     struct BiTreeNode *left;
     8     struct BiTreeNode *right;
     9 }BiTreeNode; 
    10 
    11 void FindPathCore(BiTreeNode *pHead, int sum, vector<int>& path, int currentSum){
    12     currentSum += pHead->data;
    13     path.push_back(pHead->data);
    14     
    15     //如果是叶子节点,并且路径上的节点的等于输入的值,打印这条路径
    16     bool isLeaf = pHead->left == NULL && pHead->right == NULL;
    17     if(currentSum == sum && isLeaf){
    18         cout<<"The path is: ";
    19         vector<int>::iterator iter = path.begin();
    20         for(; iter != path.end(); ++iter){
    21             cout<<*iter<<' ';
    22         }
    23         
    24         cout<<endl;
    25     } 
    26     
    27     //如果不是叶子节点,需要遍历它的子节点
    28     if(currentSum < sum && pHead->left != NULL){             //如果当前的和已经大于期望的和,那么久不需要再向下寻找了 
    29         FindPathCore(pHead->left, sum, path, currentSum);
    30     } 
    31     if(currentSum < sum && pHead->right != NULL){
    32         FindPathCore(pHead->right, sum, path, currentSum);
    33     }
    34     //返回父节点之前,在路径上删除当前节点 
    35     path.pop_back();
    36 }
    37 
    38 void FindPath(BiTreeNode *pHead, int sum){
    39     if(pHead == NULL){
    40         return ;
    41     }
    42     
    43     vector<int> path;
    44     int currentSum = 0;
    45     FindPathCore(pHead, sum, path, currentSum);
    46 }
    47 
    48 BiTreeNode *createTree(){           //前序遍历的方法创建一棵二叉树 
    49     int item;
    50     BiTreeNode *pNode = NULL;
    51     cin>>item;
    52     
    53     if(item != -1){
    54         BiTreeNode *tmp = new BiTreeNode();
    55         pNode = tmp;
    56         tmp->data = item;
    57         
    58         pNode->left = createTree();
    59         pNode->right = createTree();
    60         
    61         return pNode;        
    62     } 
    63     else{
    64         pNode = NULL;
    65         return pNode;
    66     }
    67 }
    68 
    69 int main(){                      //测试方法 
    70     BiTreeNode *test = createTree();
    71     FindPath(test, 22);
    72     return 0;
    73 } 

    实现效果;

  • 相关阅读:
    布局
    面向对象....(概况)
    下拉城市列表
    下拉列表
    内容窗体
    《面向对象》-继承
    《面向对象》--类
    《面向对象》第一讲
    常用的正则表达式
    正则表达式
  • 原文地址:https://www.cnblogs.com/dormant/p/5379949.html
Copyright © 2020-2023  润新知