IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 二叉树寻找前驱的普通方法和线索二叉树对比 -> 正文阅读

[数据结构与算法]二叉树寻找前驱的普通方法和线索二叉树对比

在这里插入图片描述

普通方法

//结构体
typedef struct TreeNode {

	int data;
	struct TreeNode* lchild;
	struct TreeNode* rchild;

}*BT,TN;

//寻找二叉树中序遍历的前驱
BT pre;
void findPreInorder(BT root,int p) {
	if (!root)return;
	findPreInorder(root->lchild,p);
	if (root->data == p) {
		printf("%d\n", pre->data);
		return;
	}
	else {
		pre = root;
	}
	findPreInorder(root->rchild,p);

}
//寻找二叉树中序遍历的后继
TN pre1 = {-1};
BT pre2 = &pre1;

void findSubInorder(BT root, int p) {
	if (!root)return;
	findSubInorder(root->lchild, p);
	if (pre2->data == p) {//当前驱等于要找的节点的时候该节点就是要寻找的后继
		
		printf("%d\n", root->data);
		pre2->data = -1;//防止下次再进入if
		return;
	}
	else {
		pre2 = root;
	}
	findSubInorder(root->rchild, p);

}


//中序遍历该树用作对比,看看一会我们求得前驱和后继对不对
void inorder(BT temphead) {
	if (!temphead)return;
	inorder(temphead->lchild);
	printf("%d ", temphead->data);
	inorder(temphead->rchild);

}

//广度优先初始化二叉树,图像和上面图片一样
void order(BT head) {
	queue<BT> q;
	BT node = (BT)malloc(sizeof(BT));
	q.push(head);
	int i = 2;
	while (i < 16) {
		BT lnode = (BT)malloc(sizeof(BT));
		lnode->data = i;
		lnode->lchild = NULL;
		lnode->rchild = NULL;
		i++;
		BT rnode = (BT)malloc(sizeof(BT));
		rnode->data = i;
		rnode->lchild = NULL;
		rnode->rchild = NULL;
		i++;
		q.front()->lchild = lnode;
		q.front()->rchild = rnode;
		q.pop();
		q.push(lnode);
		q.push(rnode);


	}

}

int main() {
	BT head = (BT)malloc(sizeof(BT));
	head->data = 1;
	order(head);
	BT temphead = head;//避免一会树得根节点地址丢失
	printf("中序遍历:\n");
	inorder(temphead);
	printf("\n寻找节点5的前驱:");
	temphead = head;
	findPreInorder(temphead, 5);
	printf("\n寻找节点5的后继:");
	temphead = head;
	findSubInorder(temphead, 5);


}

缺点

每次寻找某节点前驱还要再遍历一次二叉树不能直接得到某节点的前驱

线索二叉树

之前我们提到了,二叉树的是存在n+1个空链域的,反正这些内存空着也是空着大佬们就想到了利用这些空的链域搞点事情,弄出了一个线索二叉树。

//建立
typedef struct TreeNode {
	int data;
	bool tagClueLChild=false;
	bool tagClueRChild=false;
	struct TreeNode* lChild=NULL;
	struct TreeNode* rChild=NULL;
}*BT;
//中序遍历线索二叉树
void cluePreInorder(BT root) {
	if (!root)return;
	cluePreInorder(root->lChild);
	visit(root);
	cluePreInorder(root->rChild);
}

//建立一个全局前驱节点
static BT pre;

void visit(BT root) {
	if (root->lChild == NULL) {
		root->lChild = pre;
		root->tagClueLChild = true;

	}
	if (pre != NULL && pre->rChild == NULL) {
		pre->rChild = root;
		pre->tagClueRChild = true;
	}
	pre = root;
}

然后我们就可以愉快的直接从某个节点直接找到它的前驱和后继了不用再去遍历一遍二叉树了。

注意

这里我们只给出了中序的线索二叉树实现,但是再实现先序线索二叉树的时候要避免死循环的情况

//先序遍历线索二叉树
void cluePrePreorder(BT root) {
	if (!root)return;
	visit(root);
	cluePrePreorder(root->lChild);
	cluePrePreorder(root->rChild);
}

在这里插入图片描述

也就是当root的节点为8的时候,二叉树的前驱pre为4,再visit的时候会把8的lChild指向4节点在进行下一句cluePrePreorder(root->lChild);又会回到8节点此时8节点以经访问过了。所以代码要改进为

//先序遍历线索二叉树
void cluePrePreorder(BT root) {
	if (!root)return;
	visit(root);
	if(root->tagClueLChild)//当不是线索二叉树的时候
	cluePrePreorder(root->lChild);
	cluePrePreorder(root->rChild);
}

要对最后一个节点的tagClueLChild修改为true

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-07 11:22:23  更:2022-05-07 11:22:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:29:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码