热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

2018.5.23(二叉树中序遍历中查找某一结点的后继结点)

#include#include#includeusingnamespacestd;structTree{intdata;Tr

#include
#include
#include
using namespace std;
struct Tree
{
int data;
Tree *parent;//存储某一结点的父结点
Tree *left,*right;
};
Tree *Insert(Tree *root,const int node)//插入元素,使其符合二叉树的结构
{
Tree *parent_point,*current_point;
Tree *new_point;
new_point=(Tree*)malloc(sizeof(Tree));//新开辟一块new_point的空间,使其left,right,parent都指向NULL
new_point->data=node;
new_point->parent=NULL;
new_point->left=NULL;
new_point->right=NULL;
if(root==NULL)
return new_point;
current_point=root;
while(current_point!=NULL)
{
parent_point=current_point;
current_point=(node>current_point->data)?current_point->right:current_point->left;//判断某一数值该放到当前结点的左子树上还是该结点的右子树上
}
if(node>parent_point->data)
{
parent_point->right=new_point;
new_point->parent=parent_point;
}
else
{
parent_point->left=new_point;
new_point->parent=parent_point;
}
return root;
}
Tree *Create(const int *node,const int len)
{
Tree *root=NULL;
for(int i=1;i<=len;i++)
root=Insert(root,node[i]);
return root;
}
Tree *Find(Tree *node,int num)//查找结点位置
{
while(node!=NULL&&node->data!=num)//node!=NULL一定要在node->data!=num前,如果在其后,当node==NULL时,node->data就是非法调用,会出错
node=(num>node->data)?node->right:node->left;//有二叉树的结构可知,左子树的值都小于其父结点,右子树的值都大于其父结点,故只需判断num与node->data的相对大小,如果num大,则node向其右子树方向去,反之,向其左子树方向去
return node;
}
void Solve(Tree *node)//查找后继元素
{
printf("%d->",node->data);
if(node->right!=NULL)//如果需查找的结点存在右子树
{
node=node->right;
while(node!=NULL&&node->left!=NULL)//查找当前节点右子树最左端的结点
node=node->left;
if(node!=NULL)
printf("%d\n",node->data);
else
printf("NULL\n");
return ;
}
if(node->right==NULL)//如果需查找的结点不存在右子树
{
while(node->parent->left!=node)//判断当前结点的父节点的左子树是否等于当前结点;
{
node=node->parent;//如果没找到满足条件的结点,当前结点指向其父节点
if(node->parent==NULL)//如果便利到根节点也没有找到其后继结点,说明其需查找的结点不存在后继结点,返回NULL;
{
printf("NULL\n");
return ;
}
}
printf("%d\n",node->parent->data);//如果while()中未执行printf("NULL\n");语句,说明其存在后继结点,打印出找到结点的父节点
return ;
}
}
void print(Tree *root)
{
if(root!=NULL)
{
print(root->left);
printf("%d ",root->data);
print(root->right);
}
}
int main()
{
Tree *root;
int n;
printf("Input n:\n");
while(cin>>n)
{
if(n==0)
break;
int node[n+1];
printf("\nInput %d numbers\n",n);
for(int i=1;i<=n;i++)
scanf("%d",&node[i]);
root=Create(node,n);
printf("***中序遍历***\n");
print(root);
printf("\n");
int num;
printf("\nInput some numbers:\n");
while(cin>>num)
{
if(num==0)
break;
Tree *find_num=Find(root,num);
if(find_num==0)
printf("No Find!\n");
else
Solve(find_num);
}
printf("\nInput n:\n");
}
return 0;
}

查找后继元素解析:
当n=9时
9个数分别为6,3,8,5,2,9,4,7,10;
其树形结构为:

《2018.5.23(二叉树-中序遍历中查找某一结点的后继结点)》
中序遍历结果为:2,3,4,5,6,7,8,9,10
如何查找某一节点的后继元素?
思路:
当某一结点存在右子树时,其后继结点为其右子树上最左的结点,例如元素3的后继节点为其右子树(元素5)最左的结点(元素4),故3的后继结点为4;
当某一结点不存在右子树时,其后继结点为第一个当前结点的父结点的左子树与当前结点相等的结点的父结点,例如,若查找元素5的后继结点,先判断其是否存在右子树,结果为不存在,去找此结点的父结点,为元素3,判断当前结点(元素5)的父节点的左子树元素2)是否与当前结点(元素5)相同,,继续向上找,当前结点来到元素5的父节点元素3位置,判断当前结点(元素3)的父节点的左子树元素3)是否为当前结点(元素3)的结点,,故第一个满足条件的结点为元素3,其父节点为元素6,故元素5的后继结点为元素6;


推荐阅读
  • c语言二元插值,二维线性插值c语言
    c语言二元插值,二维线性插值c语言 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 线段树详解与实现
    本文详细介绍了线段树的基本概念及其在编程竞赛中的应用,并提供了一个具体的线段树实现代码示例。 ... [详细]
  • 编译原理中的语法分析方法探讨
    本文探讨了在编译原理课程中遇到的复杂文法问题,特别是当使用SLR(1)文法时遇到的多重规约与移进冲突。文章讨论了可能的解决策略,包括递归下降解析、运算符优先级解析等,并提供了相关示例。 ... [详细]
  • 题目编号:2049 [SDOI2008]Cave Exploration。题目描述了一种动态图操作场景,涉及三种基本操作:断开两个节点间的连接(destroy(a,b))、建立两个节点间的连接(connect(a,b))以及查询两节点是否连通(query(a,b))。所有操作均确保图中无环存在。 ... [详细]
  • 开发笔记:树的浅析与实现 ... [详细]
  • 最近遇到了一道关于哈夫曼树的编程题目,需要在下午之前完成。题目要求设计一个哈夫曼编码和解码系统,能够反复显示和处理多个项目,直到用户选择退出。希望各位大神能够提供帮助。 ... [详细]
  • 本文通过C++语言实现了一个递归算法,用于解析并计算数学表达式的值。该算法能够处理加法、减法、乘法和除法操作。 ... [详细]
  • 本题要求计算一组正整数的最小公倍数(LCM)。输入包括多组测试数据,每组数据首先给出一个正整数n,随后是n个正整数。 ... [详细]
  • POJ2263是一个经典的图论问题,涉及寻找从起点到终点的最大载重路径。本文将详细介绍该问题的背景、解题思路及代码实现。 ... [详细]
  • 本题涉及一个长度为n的序列{ai},代表一系列树木的美学价值。任务是处理m个查询,每个查询提供三个参数l、r和P,目标是在所有满足l < l' ... [详细]
  • HNOI2003 激光炸弹问题(二维前缀和的应用)难度:中等
    HNOI2003 激光炸弹问题是一个经典的二维前缀和应用题目。本文将详细介绍如何使用二维前缀和解决该问题。 ... [详细]
  • 在尝试加载支持推送通知的iOS应用程序的Ad Hoc构建时,遇到了‘no valid aps-environment entitlement found for application’的错误提示。本文将探讨此错误的原因及多种可能的解决方案。 ... [详细]
  • 本文将深入探讨C语言中的位操作符——按位与(&)、按位或(|)和按位异或(^),通过具体示例解释这些操作符如何在位级别上对数据进行操作。 ... [详细]
  • LeetCode 实战:寻找三数之和为零的组合
    给定一个包含 n 个整数的数组,判断该数组中是否存在三个元素 a、b、c,使得 a + b + c = 0。找出所有满足条件且不重复的三元组。 ... [详细]
author-avatar
手机用户2602913291
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有