首页 > 其他分享 >从零开始学数据结构系列之第三章《先序线索二叉树查找及总代码》

从零开始学数据结构系列之第三章《先序线索二叉树查找及总代码》

时间:2024-06-18 08:59:26浏览次数:13  
标签:node pre TreeNode 从零开始 二叉树 return rchild 先序

文章目录


查找下一个节点

​   我们为啥没有像中序二叉树一样有第一个节点,因为我们一开始最大就是我们的根节点,所以无需遍历去寻找我们的第一个节点,我们的T就是我们的第一个节点

​ 我们回过来看中序线索二叉树的节点应该是怎么写的

/* 按线索来查找 */
TreeNode* getNext(TreeNode* node) 
{
	if (node -> rtag == 1)
        return node -> rchild;
    else
        return getFirst(node -> rchild);
}

​   我们想一下,这一个能不能直接搬过来用,很显然,不行,由于我们直接没有getFirst这一个函数了,那我们简单的修改一下

TreeNode* getNext(TreeNode* node) 
{
	if (node -> rtag == 1)
        return node -> rchild;
    else
        return node ->lchild;
}

​ 简单的推导一下,我们第一个传进来的参数是A,之后返回的参数是B,之后是D,后面是E, 之后是C
在这里插入图片描述
这样子好像没错,但是我们再将条件变化一下

在这里插入图片描述
在这里插入图片描述
  我们前三个节点是正常进行遍历,但是当遍历到D节点的时候,我们执行的的代码是return node ->lchild;,那D的前驱是B,那这样子的话我们遍历的顺序又不对了,那应该怎么进行修改呢







这里直接公布答案

TreeNode* getNext(TreeNode* node) 
{
	if (node -> rtag == 1 || node -> ltag == 1)
        return node -> rchild;
    else 
		return node -> lchild;
}

那我们这样子的话,就可以解决这个小问题了

其他部分和中序遍历差不多的,我们只用注意一下以上两个小问题就行了

总代码

/*可以输入
ABD##E##CF##G##
来进行验证
*/

#include <stdio.h>
#include <stdlib.h>
#define size 20

typedef struct TreeNode 
{
	char data;
	struct TreeNode *lchild;
	struct TreeNode *rchild;
	int ltag;
	int rtag;

}TreeNode;


void createTree(TreeNode** T,char* temp,int* index)
{
	char ch;
	
	ch = temp[*index];
	(*index)++;

	if( ch == '#') *T = NULL;
	else
	{
		 *T =(TreeNode*)malloc(sizeof(TreeNode));
		 (*T)->data = ch;
		 (*T)->ltag = 0;
		 (*T)->rtag = 0;
		createTree(&(*T)->lchild,temp,index);
		createTree(&(*T)->rchild,temp,index);		
	}
}

void inThreadTree(TreeNode* T, TreeNode** pre) 
{
	if(T)
	{		
		if(T->lchild == NULL)
		{
			T->ltag = 1;
			T->lchild = *pre;
		}
		if(*pre != NULL && (*pre)->rchild == NULL)
		{
			(*pre)->rtag = 1;
			(*pre)->rchild = T;
		}
		*pre = T;

		if(T->ltag == 0)
			inThreadTree(T->lchild,pre);
        inThreadTree(T -> rchild, pre);
	}
}


TreeNode* getNext(TreeNode* node) 
{
	if (node -> rtag == 1 || node -> ltag == 1)
        return node -> rchild;
    else 
		return node -> lchild;
}


int main(int argc, char* argv[]) 
{
	TreeNode *T;
	TreeNode* pre = NULL;
	int i=0;
	char *temp=NULL;
	TreeNode* node = NULL;
	temp=(char*)malloc(sizeof(char) * (size+1));
	gets(temp);
	createTree(&T,temp,&i);
	inThreadTree(T, &pre);
    pre -> rtag = 1;
    pre -> rchild = NULL;
	node = T;
	for (; node != NULL; node = getNext(node)) 
	{
        printf("%c ", node -> data);
    }
    printf("\n");

    return 0;
}

在这里插入图片描述

往期回顾

1.【第一章】《线性表与顺序表》
2.【第一章】《单链表》
3.【第一章】《单链表的介绍》
4.【第一章】《单链表的基本操作》
5.【第一章】《单链表循环》
6.【第一章】《双链表》
7.【第一章】《双链表循环》
8.【第二章】《栈》
9.【第二章】《队》
10.【第二章】《字符串暴力匹配》
11.【第二章】《字符串kmp匹配》
12.【第三章】《树的基础概念》
13.【第三章】《二叉树的存储结构》
14.【第三章】《二叉树链式结构及实现1》
15.【第三章】《二叉树链式结构及实现2》
16.【第三章】《二叉树链式结构及实现3》
17.【第三章】《二叉树链式结构及实现4》
18.【第三章】《二叉树链式结构及实现5》
19.【第三章】《中序线索二叉树理论部分》
20.【第三章】《中序线索二叉树代码初始化及创树》
21.【第三章】《中序线索二叉树线索化及总代码》
22【第三章】《先序线索二叉树理论及线索化》

标签:node,pre,TreeNode,从零开始,二叉树,return,rchild,先序
From: https://blog.csdn.net/qq_62548908/article/details/139752741

相关文章

  • 二叉树的基础讲解
    二叉树在遍历,查找,增删的效率上面都很高,是数据结构中很重要的,下面我们来基础的认识一下。(高级的本人还没学,下面的代码用伪代码或C语言写的)我会从树,树的一些专有名词,树的遍历,二叉树,二叉树的遍历以及后面升级的树进行一部分的介绍。树首先我们从最开始的树来进行讲解,我们知道......
  • yolov8从零开始到训练自己的数据集,保姆式教学文档,适合初学者
     1.搭配yolov8环境1.1 下载Conda并且搭配虚拟环境1.1.1Conda的作用    Conda是一个开源的软件包管理系统和环境管理系统,主要用于安装多个版本的软件包及其依赖关系,并能在不同环境间轻松切换。其作用在于为开发者提供一个统一的平台来管理项目的依赖关系和环境,确......
  • 跟我从零开始学C++(C++代码基础)
    引言小伙伴们是不是都等不及了,来啦来啦它来啦,在经历过前边那么多乱七八糟的但又重要的知识后,终于迎来了有关C++代码的这一步,真是不容易呀,小伙伴们,本章小雨会带着大家去从下载软件到一些简单的基础知识,放轻松~不过本章全程干货一点都不能错过呀,而且附带的Visualstudio的详......
  • 跟我从零开始学C++(C++代码基础)3
    引言小伙伴们大家好呀,又到了每日学习的时候了,今天小杨同学给大家带来了新的知识点哟,大家准备好了么,昨天学习的任务有没有消化好呢,昨天的课后练习怎么样了呢,有没有费了一番功夫弄出来呢。没有把基础打好的小伙伴们千万不要着急呀,毕竟根基不牢是要出大事情的,小伙伴们加油呀,跟......
  • 5.3.2_3 在线索二叉树中找前驱后继
    ......
  • 从零开始:AI产品经理的入门路线图
    引言:想象这样一个场景:早晨的阳光穿透窗帘,投射在新一代智能机器人上,它正静静等待着你的第一个命令开始全新的一天。这样的场景听起来像是科幻小说里的情节,但实际上,这正是AI产品经理们工作的成果。如果你对这样的未来感到兴奋,那么你可能会考虑成为一个AI产品经理——那些创......
  • 从零开始学算法/C++/第四天
    昨天参加了百度之星,完全不会写,就写了道差分第一题根据汉诺塔层数和转移次数输出每个圆盘的位置很熟悉,刚学C语言那会儿就学了这个东西,已经忘光光了;大约第三题是求区间中位数,因为只查询一次,差分是比较合适的;大约第四题是括号匹配,WA了四个点,这玩意没写过类似的,还是知识面太窄了,刚......
  • 6.16-二叉树的层序遍历~
    429.N叉树的层序遍历题意描述:给定一个N叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。例如,给定一个3叉树:返回其层序遍历:[[1],[3,2,4],[5,6]]思路:AC代码:classSolution{public:vector<vector<int>>levelOrder(Node*root){queue<No......
  • 05-5.3.1_1 二叉树的先中后序遍历
    ......
  • 5.3.1_2 二叉树的层次遍历
    ......