求一个结点x在在二叉树中的双亲结点算法

1、算法思想

使用先序递归遍历思想完成算法设计。首先判断节点的左右孩子是否存在,若存在,并且左右孩子中有一个符合查找要求,则返回元素!否则,继续递归查找,直到成功或者找不到符合要求的结点!

2、算法实现

——————————————————————————————————————————————————
#include<stdio.h>
#define MaxSize 20
#include
#include<stdlib.h>
#define endl ‘\n’
using namespace std;
typedef struct BiTNode{ //结点
char data; //数据域
struct BiTNode *lchild,*rchild; //指针域
}BiTNode,*BiTree;
——————————————————————————————————————————————————
//先序遍历的顺序建立二叉链表
void CreateTree(BiTree &T){
char ch;
cin>>ch;
if (ch == ‘#’) T = NULL; //递归结束,建立空树
else{
T = new BiTNode; //申请一个结点
T->data = ch; //将输入值赋值给T
CreateTree(T->lchild); //递归创建左子树
CreateTree(T->rchild); //递归创建右子树
}
}
——————————————————————————————————————————————————
//先遍历输出
void PreOrder(BiTree T){
if(T != NULL){
cout<data<<" “; //递归打印当前节点
PreOrder(T->lchild); //递归输出左子树
PreOrder(T->rchild); //递归输出右子树
}
}
——————————————————————————————————————————————————
//查找函数
void FindParents(BiTree T,char x){
if(T != NULL){
if(T->lchild != NULL && T->lchild->data == x) cout<<”\n"<<x<<" 的父节点是"<data;
if(T->rchild != NULL && T->rchild->data == x) cout<<“\n”<<x<<" 的父节点是"<data;;
FindParents(T->lchild,x);
FindParents(T->rchild,x);
}
}
——————————————————————————————————————————————————
//主函数
main(){
BiTree T;
cout<<“\n请输入字符!(若输入的是#代表建立的是一棵空树):”;
CreateTree(T);
cout<<“\n先序遍历输出二叉链表:”; //A B C # # D E # # G # # F # # #
//ABC##DE##G##F###
PreOrder(T);
fflush(stdin);
char x;
cout<<“\n\n请输入字符:”;
scanf(“%c”,&x);
FindParents(T,x);
}
——————————————————————————————————————————————————

在这里插入图片描述

3、核心代码

//查找函数 
void  FindParents(BiTree T,char x){
	if(T != NULL){
		if(T->lchild != NULL && T->lchild->data == x) cout<<"\n"<<x<<" 的父节点是"<<T->data;
		if(T->rchild != NULL && T->rchild->data == x) cout<<"\n"<<x<<" 的父节点是"<<T->data;;
		FindParents(T->lchild,x);
		FindParents(T->rchild,x);
	}
}

4、算法分析

该算法的实现是借助二叉树的先序遍历。递归遍历二叉树,每一次递归调用首先利用先序遍历判断当前根节点是否存在左右孩子,若是存在并且左右中的数值就是所给参数的孩子结点,那么当前父节点肯定是所给孩子结点的父亲节点,直接使用return返回当前参数结点的父亲节点,强行退出递归调用栈,程序执行完毕!否则继续递归调用二叉树,直到查找成功或者失败!

  • 12
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Q渡劫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值