栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

数据结构与算法之二叉树的线索化

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据结构与算法之二叉树的线索化

两种方式(这里主要讲述中序线索化)

数据结构与算法之二叉树的线索化
  • 两种方式(这里主要讲述中序线索化)
    • 用土办法找到中序前驱(暴力)
    • 中序线索化
      • 全部代码展示
  • 总结

用土办法找到中序前驱(暴力)
void InOrder(BiTree T){
	if(T!=NULL){
		InOrder(T->lchild);//递归遍历左子树
		visit(T);
		InOrder(T->rchild);//递归遍历右子树
	}
}
void visit(BiTNode *q){
	if(q==p){
		final = pre;//找到p的前驱
	}else{
		pre = q;
	}
}
//辅助全局变量,用于查找结点p的前驱
BiTNode *p;//p指向目标结点
BiTNode * pre = NULL;//指向当前访问结点的前驱
BiTNode * final = NULL;//用于记录最终结果

中序线索化

先序线索化和后序线索化也参考此思路

typedef struct ThreadNode{
  ElemType data;
  struct ThreadNode *lchild,*rchild;
  int ltag,rtag;//左右线索标志
}ThreadNode,*ThreadTree;

//全局变量pre,指向当前访问结点的前驱
ThreadNode *pre=NULL;

void InThread(ThreadTree T){
	if (T!=NULL){
		InThread(T->lchild);//中序遍历左子树
		visit(T);//访问根节点
		InThread(T->rchild);//中序遍历右子树
	}
}

void visit(BiTNode *q){
	if(q->lchild==NULL){//左子树为空,建立前驱线索
		q->lchild=pre;
		q->ltag=1;
	}
	if(pre!=NUll&&q->rchild==NULL){
		pre.rchild=q;//建立前驱结点的后继线索
		pre->rtag=1;
	}
	pre=q;
}

注意:最后还要检查pre的rchild是否为NULL,如果是,则令rtag=1;

全部代码展示

#include "stdio.h"
#include "stdbool.h"
#include "stdlib.h"

typedef struct ThreadNode {
    int data;
    struct ThreadNode *lChild;
    struct ThreadNode *rChild;
    int ltag;
    int rtag;
} ThreadNode, *ThreadTree;

ThreadNode **preNode = NULL;

void preVisit(ThreadNode *pNode);


bool preInitThreadTree(ThreadTree threadTree, ThreadNode **pre) {
    if (threadTree == NULL) {
        return false;
    }
    *pre = NULL;
    //左子树
    preInitThreadTree(threadTree, pre);
    if (threadTree->lChild == NULL) {
        threadTree->lChild = (*pre);
        threadTree->ltag = 1;
    }
    //当前结点
    if (*pre != NULL && (*pre)->rChild == NULL) {
        *pre = threadTree->rChild;
        (*pre)->rtag = 1;
    }
    *pre = threadTree;
    //右结点
    preInitThreadTree(threadTree->rChild, pre);
    return true;
}


bool preOrder(ThreadTree threadTree) {
    if (threadTree == NULL) {
        return false;
    }
    preOrder(threadTree->lChild);
    preVisit(threadTree);
    preOrder(threadTree->rChild);
    return true;
}


void preVisit(ThreadNode *pNode) {
    if (pNode == NULL) {
        return;
    }
    if (pNode->lChild == NULL) {
        pNode->lChild = (*preNode);
        pNode->ltag = 1;
    }
    if ((*preNode) != NULL && (*preNode)->rChild == NULL) {
        (*preNode)->rChild = pNode;
        (*preNode)->rtag = 1;
    }
    (*preNode) = pNode;
}

总结

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/942685.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号