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


推荐阅读
  • DFS基本概念步骤优缺点典型例题递推基本概念直接或者间接调用自身的算法称为递归算法一般数据n ... [详细]
  • “在一棵树上进行路径的修改、求极值、求和”乍一看只要线段树就能轻松解决,实际上,仅凭线段树是不能搞定它的。我们需要用到一种貌似高级的复杂算法——树链剖分。  树链,就是树上的路径。剖分, ... [详细]
  • 简单数据结构模板
    一,STL1&amp;gt;STL中数据结构常见操作a.assign(b.begin(),b.begin()+3);b为向量,将b的0~2个元素构成的向量赋给aa.as ... [详细]
  • 题目描述输入整型数组和排序标识,对其元素按照升序或降序进行排序(一组测试用例可能会有多组数据)本题有多组输入,请使用whil ... [详细]
  • 题目链接:杭电多校7-VirtualJudgevjudge上题目显示的有问题,我下面附上官方题目:样例输入:32201 ... [详细]
  • 解题:洛谷2093 JZPFAR
    题面初见K-DTree其实这样的题(欧几里得距离第$x$近点对)不应该用K-DTree做,因为会被构造数据卡成$O(n^2)$,随机的另说。但是并没有找 ... [详细]
  • 什么是操作符重载?一看到重载,很容易就让人联想到成员函数重载,函数重载可以使名称相同的函数具有不同的实际功能,只要赋给这些同名函数不同的参数就可以了,操作符重载也是基于这一机制的。系统为我们提供了许多 ... [详细]
  • http:www.cnblogs.comComputerGarchive201202012334898.html一:C语言中的内存机制在C语言中,内存 ... [详细]
  • NPDP第五章 工具与度量
    什么是创意开发阶段作用:早起产生初步的产品概念;中期用于解决实施问题;后期用于规划上市。创意开发是创造、发展和传达新创意的创造性过程&# ... [详细]
  • 九宫格计算. ... [详细]
  • UNP总结 Chapter 12~14 IPv4与IPv6的互操作性、守护进程和inet超级服务器、高级I/O函数
    一、IPv4与IPv6的互操作性1.IPv4客户与IPv6服务器拥有双重协议栈的主机的一个基本特性就是:其上运行的IPv6服务器既能应付IPv4客户,又能应付IPv6客户。这是通过使用IPv4映射 ... [详细]
  • PIMPL 是 C++ 中的一个编程技巧,意思为指向实现的指针。具体操作是把类的实现细节放到一个单独的类中,并用一个指针进行访问 ... [详细]
  • 在这一期的SendMessage函数应用中,我将向大家介绍如何利用消息函数来扩展树型列表(TreeView)控件的功能相信对于树型列表控件大家十分的熟悉, ... [详细]
  • 人脸识别中的损失函数
    本文主要是针对人脸识别中的各种loss进行总结。 背景对于分类问题,我们常用的lossfunction是softmax,表示为:,当然有softmax肯定也有hardmax:,so ... [详细]
  • ROC曲线原理及Python实现
    受试者工作特征曲线(receiveroperatingcharacteristiccurve,简称ROC曲线),是比较两个分类模型好坏的可视化工具ROC曲线的作用:1.较容易地查出 ... [详细]
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社区 版权所有