热门标签 | 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;


推荐阅读
  • Codeforces Round #566 (Div. 2) A~F个人题解
    Dashboard-CodeforcesRound#566(Div.2)-CodeforcesA.FillingShapes题意:给你一个的表格,你 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • C++: 实现基于类的四面体体积计算
    本文介绍如何使用C++编程语言,通过定义类和方法来计算由四个三维坐标点构成的四面体体积。文中详细解释了四面体体积的数学公式,并提供了两种不同的实现方式。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本实验主要探讨了二叉排序树(BST)的基本操作,包括创建、查找和删除节点。通过具体实例和代码实现,详细介绍了如何使用递归和非递归方法进行关键字查找,并展示了删除特定节点后的树结构变化。 ... [详细]
  • 本题涉及一棵由N个节点组成的树(共有N-1条边),初始时所有节点均为白色。题目要求处理两种操作:一是改变某个节点的颜色(从白变黑或从黑变白);二是查询从根节点到指定节点路径上的第一个黑色节点,若无则输出-1。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 本文介绍了在Windows环境下使用pydoc工具的方法,并详细解释了如何通过命令行和浏览器查看Python内置函数的文档。此外,还提供了关于raw_input和open函数的具体用法和功能说明。 ... [详细]
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • 本文基于刘洪波老师的《英文词根词缀精讲》,深入探讨了多个重要词根词缀的起源及其相关词汇,帮助读者更好地理解和记忆英语单词。 ... [详细]
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社区 版权所有