在二元树中找出和为某一值的所有路径

在二元树中找出和为某一值的所有路径
题目:输入一个整数和一棵二元树。
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如 输入整数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
};


解析:

建树依然建立二元查找树,然后用深搜,用一个path数组把结点的值存储起来。用深搜打印路径比较方便。没有什么特殊和很难的地方。

    这里需要注意的是:这个系列中我在系列(一)中上传的pdf文件里题目4的图形没对,可能会有误导。树的形状应该是

10

        / \
       5  12
      / \
     4   7

    最后,依然贴代码吧!

 

 
 
  1. /* 
  2.  * Problem_4.cpp 
  3.  * 在二元树中找出和为某一值的所有路径 
  4.  *  Created on: 2012-8-28 
  5.  *      Author: Administrator 
  6.  */ 
  7. #include<stdio.h> 
  8. struct BinaryTreeNode{ 
  9.     int data; 
  10.     BinaryTreeNode *pLeft,*pRight; 
  11.     BinaryTreeNode(){ 
  12.         pLeft=pRight=NULL; 
  13.     } 
  14. }; 
  15. #define M 100 
  16. int path[M],top=-1; 
  17. bool addNode(BinaryTreeNode **root,int value){ 
  18.     if(*root!=NULL){ 
  19.         if(value>(*root)->data){ 
  20.             addNode(&((*root)->pRight),value); 
  21.         }else if(value<(*root)->data){ 
  22.             addNode(&((*root)->pLeft),value); 
  23.         }else
  24.             printf("repeated node!\n"); 
  25.             return false
  26.         } 
  27.     }else
  28.         BinaryTreeNode *p; 
  29.         p=new BinaryTreeNode(); 
  30.         p->data=value; 
  31.         *root=p; 
  32.     } 
  33.     return true
  34. /* 
  35.  * 
  36.  * */ 
  37. void search(BinaryTreeNode *cur,int sum,int &s){ 
  38.     path[++top]=cur->data; 
  39.     if(cur->pLeft==NULL&&cur->pRight==NULL&&s==sum+cur->data){ 
  40.         for(int i=0;i<=top;i++){ 
  41.             printf("%d ",path[i]); 
  42.         } 
  43.         printf("\n"); 
  44.     } 
  45.     if(sum+cur->data>=s){//剪枝 
  46.         --top; 
  47.         return
  48.     } 
  49.     if(cur->pLeft!=NULL) 
  50.         search(cur->pLeft,sum+cur->data,s); 
  51.     if(cur->pRight!=NULL) 
  52.         search(cur->pRight,sum+cur->data,s); 
  53.     --top; 
  54. int main(){ 
  55.     int data[5]={10,5,12,4,7}; 
  56.     BinaryTreeNode *root=NULL; 
  57.     for(int i=0;i<5;i++){ 
  58.         addNode(&root,data[i]); 
  59.     } 
  60.     int a=22; 
  61.     search(root,0,a); 
  62.     return 0; 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值