• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C++实现查找二叉树中和为某一值的所有路径的示例

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

作者:Zhang_H 字体:[增加 减小] 来源:互联网 时间:2017-05-28

Zhang_H 通过本文主要向大家介绍了c++创建二叉树,c++实现二叉树,c++求二叉树的深度,c++二叉树,c++二叉树的建立等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如 输入整数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)];
}
</div>

 

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C++使用递归和非递归算法实现的二叉树叶子节点个数计算方法
  • C++基于递归和非递归算法求二叉树镜像的方法
  • C++将二叉树转为双向链表及判断两个链表是否相交
  • C++实现查找二叉树中和为某一值的所有路径的示例
  • C++非递归建立二叉树实例
  • C++实现二叉树非递归遍历方法实例总结
  • C++二叉树结构的建立与基本操作
  • c++二叉树的几种遍历算法

相关文章

  • 2017-05-28C语言中isalnum()函数和isalpha()函数的对比使用
  • 2017-05-28浅谈带缓冲I/O 和不带缓冲I/O的区别与联系
  • 2017-05-28解析C++中的字符串处理函数和指针
  • 2017-05-28Dijkstra最短路径算法实现代码
  • 2017-05-28C++读取INI配置文件类实例详解
  • 2017-05-28C语言从txt文件中逐行读入数据存到数组中的实现方法
  • 2017-05-28C语言实现socket简单通信实例
  • 2017-05-28C++空类详解
  • 2017-05-28C语言main函数的参数及其返回值详细解析
  • 2017-05-28探讨:程序在内存中的分配(常量,局部变量,全局变量,程序代码)问题

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Cocos2d-x学习笔记之CCScene、CCLayer、CCSprite的默认坐标和默认锚点实验
    • c语言获取直播吧最近一周nba比赛信息
    • C++ 关于 CMFCPropertyGridCtrl 的使用方法
    • C++中的内存分区介绍
    • 判断给定的图是不是有向无环图实例代码
    • C++ 头文件系列(set)详解
    • 浅谈C++指针(必看)
    • 详解 linux c++的编译器g++的基本使用
    • 如何解决C语言,函数名与宏冲突
    • 基于WTL中使用双缓冲避免闪烁的解决方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有