首页 > 编程知识 正文

二叉树先序遍历创建二叉树,二叉树的先序遍历和中序遍历

时间:2023-05-04 01:58:01 阅读:34414 作者:2235

本文序言1、方法可行性2、主要代码实现1 .定义新树节点2 .增加中继遍历线索3 .中继遍历输出3、所有代码

前言

如果需要多次向前后顺序遍历二叉树,有线索的二叉树可以加快二叉树的遍历。

一、方法可行性二叉树的叶节点上存在一个或两个空指针,重用空指针有助于穿越二叉树。

二叉树节点总数: n2 n0 n1,边总数:2 * n2 n1

根据节点数=边数1,得到等式2 *n2 n1 1=n2 n1 n0,即n2=n0 - 1

二叉树中空指针的数量:2 * n0 n1 n2 n0 n1

因此,空指针足以存储整个树,并且还可以用于存储该节点的前体节点和后续节点。

以中顺扫描为例,草图中的紫边利用原始空节点指向节点的前体,红边指向节点的后继。

二、主代码实现1 .新的树节点定义typedef struct Node { int data; 结构节点*液晶屏,*液晶屏; int ltag、rtag; }节点; 增加标志ltag、rtag位

ltag=rtag=0表示该节点为正常节点,左右子树不为空),lchild和rchild指向其左右子树

ltag=1表示lchild指向该节点的前驱pre

rtag=1表示rchild指向该节点的后继

通过rtag和rchild,可以连结树整体的中依次扫描顺序

2 .为中序遍历增加线索正常二叉树中序遍历,为叶节点增加线索,pre保存中序遍历中的前体节点

voidbuild_thread(node*root ) if ) root==null ) return; 静态节点* pre=null; build _ thread (根液晶); 根液晶屏(if ) {根液晶屏==空} } {根液晶屏=预; 根标签=热标签; (if ) pre!=NULL pre-rchild==NULL ) { pre-rchild=root; 预标签=thread; (} pre=根; build _ thread (根循环); } 3.中序扫描输出most_left )函数中找到当前节点的最左侧叶的节点,便可根据上一步骤建立的线索来扫描二叉树

节点* most _ left (节点* p ) while ) p!=NULL p-ltag==NORMAL p-lchild!=null(p=p-lchild; 返回p; }voidoutput(node*root ) node*p=most_left ) root ); while(p!=null(printf ) ' %d ',p-data ); if(p-RTAG==thread ) { p=p-rchild; }else{p=most_left(p-rchild ); } }返回; }三、所有代码# include stdio.h # include stdlib.h # include time.h # define normal0# define thread1typedefstructnode { int } 结构节点*液晶屏,*液晶屏; int ltag、rtag; }节点; 节点*获取新节点(intval ) node * p=(node * ) malloc (sizeof ) node ); p-data=val; p-lchild=p-rchild=NULL; p-ltag=p-rtag=NORMAL; 返回p; }节点*插入(节点*根,int val ) if )根==空)返回节点) val; 根数据==val (if )返回根; if (根数据)根液晶屏=插入(根液晶屏,val ); else根字符=插入(根字符,val ); 返回根; }voidbuild_Thread(node*root ) if ) root==null ) return; 静态节点* pre=null; build _ thread (根液晶); if (根液晶屏==空值) {根液晶屏=预; 根标签=热标签; (if ) pre!=NULL pre-rchild==NULL ) { pre-rchild=root; 预标签=thread; (} pre=根; build _ thread (根循环); }node*most_left(node*p ) while ) p!=NULL p-ltag==NORMAL p-lchild!=null(p=p-lchild; 返回p; }voidoutput(node*root ) node*p=most_left ) root ); while(p!=null(printf('%d ',p-data ) ); if(p-RTAG==thread ) { p=p-rchild; }else{p=most_left(p-rchild ); } }返回; }voidin_order(node*root ) if ) root==null ) return; if (根标签==正常) in_order )根标签; printf('%d ',根数据); if (根标记==正常) in_order )根字符; }语音清除(node * root ) if ) root==null ) return; 根标签==正常)清除(if )根标签; 根(root-rtag==normal ) clear )根(root-rchild; 自由(根); (}int main ) ) Srand ) time(0); #define MAX_OP 20 Node *root=NULL; for(intI=0; i MAX_OP; I ) intval=rand(0; 根=插入(根,val ); } build _ thread (根); output (根)、printf (n ); in _ order (根; //普通中序扫描对比#undefmax_opclear(root ); 返回0; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。