C++实现查找二叉树中和为某一值的所有路径的示例

 更新时间:2016年02月04日 17:29:43   作者:Zhang_H  
这篇文章主要介绍了C++实现查找二叉树中和为某一值的所有路径的示例,文中的方法是根据数组生成二叉排序树并进行遍历,需要的朋友可以参考下

从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如 输入整数22和如下二元树

201624172555583.png (138×105)

则打印出两条路径:10, 12和10, 5, 7。

先序遍历树即可得到结果。
算法: FindPath(BTree * root,int sum,int target,Stack * s) 用来计算,sum为栈中的元素的和,target为目标值。
到达一个节点之后计算当前节点和sum的和,如果为target,输出路径返回,如果大于target,则直接返回,如果小于,则将当前节点的值入栈,更新sum的值,继续遍历,遍历完成之后,也就是从当前节点返回的时候,将其从栈中弹出,更新sum
代码如下(GCC编译通过):


#include "stdio.h"
#include "stdlib.h"
#define MAXSIZE 8
 
typedef struct node
{
 int data;
 struct node * left;
 struct node * right;
}BTree;
 
typedef struct 
{
 int top;
 int data[MAXSIZE];
}Stack;
 
BTree * CreatTree(int a[],int n);
void Iorder(BTree * root);
void Porder(BTree * root);
void FindPath(BTree * root,int sum,int target,Stack * stack);
void InitStack(Stack * stack);
void Push(Stack * s,int val);
int Pop(Stack *s);
 
int main(void)
{
 int array[MAXSIZE] = {5,3,8,7,2,4,1,9},target;
 BTree * root;
 Stack stack;
  
 target = 12;
 root = CreatTree(array,MAXSIZE);
 InitStack(&stack);
 
 printf("二叉树内元素升序排列:");
 Iorder(root);
 printf("\n");
 
 printf("目标值:%d,路径:",target);
 FindPath(root,0,target,&stack);
 
 printf("\n");
 return 0;
}
 
//根据数组生成二叉排序树
BTree * CreatTree(int a[],int n)
{
 BTree * root ,*p,*cu,*pa;
 int i;
  
 root = (BTree *)malloc(sizeof(BTree));
 root->data = a[0]; 
 root->left = root->right =NULL;
  
 for(i=1;i<n;i++)
 {
  p = (BTree *)malloc(sizeof(BTree));
  p->data = a[i];
  p->left = p->right =NULL;
  cu = root;
 
  while(cu)
  {
   pa = cu;
   if(cu->data > p->data)
    cu = cu->left;
   else
    cu = cu->right;
  }
  if(pa->data > p->data)
   pa->left = p;
  else
   pa->right = p;
 } 
 
 return root;
}
 
//中根遍历,打印二叉树
void Iorder(BTree * root)
{
 if(root)
 {  
  Iorder(root->left);
  printf("%3d",root->data);
  Iorder(root->right);
 }
}
 
//寻找路径
void FindPath(BTree * root,int sum,int target,Stack * s)
{
 int i;
 
 if(!root)
  return ;
 if(sum + root->data == target)
 {
  Push(s,root->data);
  for(i = 0;i<s->top;i++)
   printf("%3d",s->data[i]);
  return;
 }
 
 else if(sum + root->data > target)
   {
  return;
   }
   else
   {
  Push(s,root->data);
  sum += root->data;
  FindPath(root->left,sum,target,s);
  FindPath(root->right,sum,target,s);
  sum -= root->data;
  Pop(s);
   }
}
 
//初始化栈
void InitStack(Stack * s)
{
 s->top = 0;
}
 
//入栈
void Push(Stack *s,int val)
{
 if(s->top == MAXSIZE)
 {
  printf("栈满,无法入栈!\n");
  return;
 }
 s->data[(s->top)++] = val;
 
}
 
//出栈
int Pop(Stack *s)
{
 if(s->top == 0)
 {
  printf("栈空,无法出栈!\n");
  return;
 }
  
 return s->data[--(s->top)];
}

 

相关文章

  • OpenCV实现图像校正功能

    OpenCV实现图像校正功能

    这篇文章主要为大家详细介绍了OpenCV实现图像校正功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • 哈夫曼算法构造代码

    哈夫曼算法构造代码

    这篇文章主要介绍了哈夫曼算法构造代码,有需要的朋友可以参考一下
    2013-12-12
  • C++Primer笔记之顺序容器的使用详解

    C++Primer笔记之顺序容器的使用详解

    本篇文章对C++Primer 顺序容器的使用进行了详细的分析介绍。需要的朋友参考下
    2013-05-05
  • 打印菱形以及斐波纳契数列的几种解法介绍

    打印菱形以及斐波纳契数列的几种解法介绍

    本篇文章是对打印菱形及斐波纳契数列的几种解法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • C迷途指针详解

    C迷途指针详解

    这篇文章主要介绍了C迷途指针,迷途指针又称为悬空指针、野指针,其对C程序的安全性与稳定性影响巨大,本文对其原理与检测方法做了较为详尽的分析,需要的朋友可以参考下
    2014-09-09
  • 哈夫曼的c语言实现代码

    哈夫曼的c语言实现代码

    着先通过 HuffmanTree() 函数构造哈夫曼树,然后在主函数 main()中自底向上开始(也就是从数组序号为零的结点开始)向上层层判断,若在父结点左侧,则置码为 0,若在右侧,则置码为 1。最后输出生成的编码
    2013-07-07
  • C++实现迷宫游戏

    C++实现迷宫游戏

    这篇文章主要为大家详细介绍了C++实现迷宫游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • 一些C语言中字符串的算法问题解决实例小结

    一些C语言中字符串的算法问题解决实例小结

    这篇文章主要介绍了一些C语言中字符串的算法问题解决实例小结,包括将字符串转化为int类型的数及旋转字符串等操作,需要的朋友可以参考下
    2016-03-03
  • C语言实现电影院选座管理系统

    C语言实现电影院选座管理系统

    这篇文章主要为大家详细介绍了C语言实现电影院选座管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • 深入浅析C++ traits技术

    深入浅析C++ traits技术

    traits就是提取“被传进的对象”对应的返回类型,让同一个接口实现对应的功能。因为STL的算法和容器是分离的,两者通过迭代器链接,本文通过实例代码给大家介绍C++ traits技术,感兴趣的朋友一起看看吧
    2021-05-05

最新评论