Estrutura de dados - árvore binária | Compreensão e realização da árvore binária de pistas

Para uma árvore binária com n nós:
ela tem 2 * n campos de ponteiro

Correspondente a ele tem n-1 ponteiros ramos

Existem n + 1 campos de ponteiro que estão vazios (nas folhas, ou não nos nós da árvore binária completa)

A árvore binária de pistas usa n + 1 domínios de cadeia vazia para armazenar as informações do predecessor e sucessor do nó.

A solução é adicionar dois campos de sinalização: sinalizador esquerdo ltag e sinalizador direito rtag.
Neste momento, a estrutura do nó da árvore binária de pista é a seguinte:
lchild ltag data rtag rchild

Onde
ltag é 0 refere-se ao filho esquerdo do nó, quando é 1, refere-se ao predecessor do nó

Quando rtag é 0, ele aponta para o filho certo do nó, e quando é 1, ele aponta para o sucessor do nó.

A essência da pista é mudar o ponteiro nulo da árvore binária para uma pista para o predecessor ou sucessor. Este processo é obtido ao percorrer a árvore binária

——————————————————————————————————————
// pre é sempre o nó no processo O anterior um da árvore (a ordem é de acordo com a travessia)
// Uma vez que o pré está na frente e a árvore atrás,
então primeiro faça o filho esquerdo da árvore apontar para o nó anterior
// e então faça o filho certo do ponto pré para o nó da árvore
// atravessando A árvore continua mudando durante o processo, e o pré também está mudando

// Não entendi como gerar uma lista duplamente vinculada no início

可以这样思考   我们输入时是以二叉树的顺序输入
然后遍历时有着不一样的顺序 
这个时候已经可以根据不一样的遍历方式根据A点找到其他点(而非拘泥于输入时候的顺序)
那么这些点又重新建立了关系

但这些关系是单向的


加上线索的原因就是使这些新的关系变为双向的
从而变为了双向链表!!!

Insira a descrição da imagem aqui

比如这里输入的顺序是A B C D E F G
这也是前序遍历的顺序

Insira a descrição da imagem aqui

但中序遍历可以得到B D C E A F G这样的顺序

Insira a descrição da imagem aqui

同理 后序遍历也是如此

O predecessor e o sucessor de um nó podem ser diferentes com diferentes regras de passagem;
a árvore binária de pistas correspondente à pré-ordem, ordem média e pós-ordem é chamada de árvore binária de pré-sugestão, árvore binária de sugestão de ordem média e árvore binária de sugestão subsequente.

	//pre始终在过程中的结点tree的前一个(顺序是按照遍历的来) 
	//既然pre在前  tree在后
	//那么先使tree的左孩子指向pre结点
	//再使得pre的右孩子指向tree结点

	//在遍历的过程中tree一直变化,  pre也在变化
	//刚开始没有理解双向链表如何生成 看图可以推一下
#include<iostream>
using namespace std;
typedef int Status;
typedef char elementype;

typedef enum {
    
    Link,thread}Pointertag;//枚举类型  第一个不声明的话就为1,后面依次增加

typedef struct TBree
{
    
    
	elementype data;
	struct TBree *lchild, *rchild;
	Pointertag ltag, rtag;
}*TB_NODE,BNODE;

//中序线索二叉树
Status InitThread_mid(TB_NODE &tree,TB_NODE &pre)
{
    
    
	if (tree == NULL)
	{
    
    
		return 0;
	}
	else
	{
    
    
		InitThread_mid(tree->lchild,pre);

		if (!tree->lchild)//如果某元素的左孩子不存在的话,则使pre为其它的前驱   使得遍历顺序直接能用指针找到
		{
    
    
			tree->ltag = thread;
			tree->lchild = pre;
		}
		if (pre->rchild == NULL)//如果前驱元素的右孩子不存在的话,使其右孩子指向下一个  即建立后继
		{
    
    
			pre->rtag = thread;
			pre->rchild = tree;
		}
		pre = tree;//保持pre为   前面的元素
		//这里原为中序遍历的输出

		InitThread_mid(tree->rchild,pre);
	}
	return 0;
}
//前序线索二叉树
Status InitThread_before(TB_NODE &tree, TB_NODE &pre)
{
    
    
	if (tree == NULL)
	{
    
    
		return 0;
	}
	else
	{
    
    
		if (tree->lchild == NULL)//建立该结点的前驱
		{
    
    
			tree->ltag = thread;
			tree->lchild = pre;
		}
		if (pre->rchild == NULL)//建立前驱的后继
		{
    
    
			pre->rtag = thread;
			pre->rchild = tree;
		}
		pre = tree;
		InitThread_before(tree->lchild, pre);
		InitThread_before(tree->rchild,pre);
	}
	return 0;
}
//后续线索二叉树
Status Initthread_after(TB_NODE &tree, TB_NODE &pre)
{
    
    
	if(tree == NULL)
	{
    
    
		return 0;
	}
	else
	{
    
    
		Initthread_after(tree->lchild, pre);
		Initthread_after(tree->rchild,pre);

		if (tree->lchild == NULL)
		{
    
    
			tree->ltag = thread;
			tree->lchild = pre;
		}
		if (pre->rchild == NULL)
		{
    
    
			pre->rtag = thread;
			pre->rchild = tree;
		}
		pre = tree;
	}
}
//当有了线索之后,二叉树可以被认为是一个双向链表

Representação em cadeia da árvore binária | saída de pré-encomenda | saída de acompanhamento | saída em ordem | destruição e outras operações

Representação dos pais dos filhos da estrutura de armazenamento sequencial em árvore N-ária + lista vinculada | árvore de estrutura de dados | Implementação C ++

Acho que você gosta

Origin blog.csdn.net/weixin_46096297/article/details/112149329
Recomendado
Clasificación