【100题】第四题

 题目:输入一个整数和一棵二叉树。
从树的结点开始往下访问一直结点所经过的所有结点形成一条路径
打印出节点和等于输入整数的所有路径。
例如 输入整数22和如下二叉树
      10  
    /      \  
   5      12   
 /    \  
4     7
则打印出两条路径:10, 12和10, 5, 7。

二叉树节点的数据结构定义为:
struct BinaryTreeNode //二叉树节点结构

{
    int m_nValue; 

    BinaryTreeNode *m_pLeft;
    BinaryTreeNode *m_pRight;
};

源码:(可以运行,但是还有些问题没搞明白……持续更新中)

  

   #include "stdio.h"
#include "malloc.h"


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
};


//打印路径
void printPath(BinaryTreeNode *path);
/**
 *sum为要求的整数和
 *curSum为从根节点到tree父节点,路径上所有数的和
 *path指向当前路径的最后一个节点,该路径有BinaryTreeNode组成双向链表
 *m_pRight指向路径下一节点,m_pLeft指向上一节点
**/
void searchPath(BinaryTreeNode *tree,BinaryTreeNode *path,int curSum,int sum)
{
curSum += tree->m_nValue;

if(curSum>sum)//路径值已经大于所求和,返回
return;

//如果没有返回 说明 当前值<输入值 

BinaryTreeNode *root=new BinaryTreeNode();
//BinaryTreeNode *root=(BinaryTreeNode *)malloc(sizeof(BinaryTreeNode));
 // root=NULL;

root->m_nValue=tree->m_nValue;

//将当前节点的值加入到路径中
if(path==NULL)//第一次加入 
path=root;
else
{
path->m_pRight=root;
root->m_pLeft=path;
path=root; //采用尾插法,标记的是尾部 
}

//如果 当前值=输入值 
if(curSum==sum)
{
//路径结束且和=sum,为所求
if(tree->m_pLeft==NULL&&tree->m_pRight==NULL)
{ 
//获得路径头节点,用于打印
while(path->m_pLeft)
path=path->m_pLeft;
printPath(path);
}
//若当前路径的和=sum,但路径还未到达叶节点,此路径不可行

//delete node;
//free(node);
//node=NULL;
return;
}

//curSum<sum,继续搜寻路径
if(tree->m_pLeft!=NULL)
searchPath(tree->m_pLeft,path,curSum,sum);

if(tree->m_pRight!=NULL)
searchPath(tree->m_pRight,path,curSum,sum);
    
        //delete node;
       // free(node);
        //node=NULL;
}
void printPath(BinaryTreeNode *path)
{
while(path)
{
printf("%5d",path->m_nValue);
//cout<<path->m_nValue<<" ";
path=path->m_pRight;
}
printf("\n");
//cout<<endl;
}
int  main()
{
BinaryTreeNode *root=NULL;

BinaryTreeNode node10;
node10.m_nValue=10;
BinaryTreeNode node5;
node5.m_nValue=5;
BinaryTreeNode node12;
node12.m_nValue=12;

BinaryTreeNode node4;
node4.m_nValue=4;

BinaryTreeNode node7;
node7.m_nValue=7;

node10.m_pLeft=&node5;
node10.m_pRight=&node12;
node5.m_pLeft=&node4;
node5.m_pRight=&node7;

node12.m_pLeft=node12.m_pRight=NULL;
node4.m_pLeft=node4.m_pRight=NULL;
node7.m_pLeft=node7.m_pRight=NULL;

root=&node10;
//BinaryTreeNode *path=(BinaryTreeNode *)malloc(sizeof(BinaryTreeNode));
    BinaryTreeNode *path=NULL;
printf("搜寻值为22的路径有如下几条:");
searchPath(root,path,0,22);


}


 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值