一步两步学算法之中序遍历线索二叉树

 1 typedef enum
 2 {
 3     SubTree,      //子树
 4     Thread        //线索
 5 }NodeFlag;
 6
 7 typedef struct ThreadTree
 8 {
 9     DATA data;
10     NodeFlag lflag;
11     NodeFlag rflag;
12     struct ThreadTree *left;
13     struct ThreadTree *right;
14 }ThreadBinTree;
15
16 ThreadBinTree *Previous=NULL;
17
18 void BinTreeThreading_LDR(ThreadBinTree *bt)    //二叉树按中序线索化
19 {
20     if(bt)
21     {
22         BinTreeThreading_LDR(bt->left);
23         bt->lflag=(bt->left)?SubTree:Thread;        //判断左子树有没有孩子
24         bt->rflag=(bt->right)?SubTree:Thread;
25         if(Previous)
26         {
27             if(Previous->rflag==Thread)                //判断前驱的右子树有没有孩子
28                 Previous->right=bt;                //把这个节点的地址赋给前驱的右子树
29             if(bt->lflag==Thread)                //判断这个节点的左子树有没有孩子
30                 bt->left=Previous;                //把前驱保存在这个节点的左子树中
31
32         }
33         Previous=bt;
34         BinTreeThreading_LDR(bt->right);
35     }
36 }
37 ThreadBinTree *BinTreeNext_LDR(ThreadBinTree *bt)  //求指定节点的后继
38 {
39     ThreadBinTree *nextnode;
40     if(!bt)
41         return NULL;
42     if(bt->rflag==Thread)
43         return bt->right;
44     else
45     {
46         nextnode=bt->right;
47         while(nextnode->lflag==SubTree)
48         {
49             nextnode=nextnode->left;
50         }
51         return nextnode;
52     }
53 }
54 ThreadBinTree *BinTreePrevious_LDR(ThreadBinTree *bt)
55 {
56     ThreadBinTree *prenode;
57     if(!bt)    return NULL;
58     if(bt->lflag==Thread)
59         return bt->left;
60     else
61     {
62         prenode=bt->left;
63         while(prenode->rflag==SubTree)
64             prenode=prenode->left;
65         return prenode;
66     }
67 }
68 void ThreadBinTree_LDR(ThreadBinTree *bt,void(*oper)(ThreadBinTree *p))  //遍历线索二叉树
69 {
70     if(bt)
71     {
72         while(bt->lflat==SubTree)
73             bt=bt->left;            //找最左下节点
74         do{
75             oper(bt);
76             bt=BinTreeNext_LDR(bt);
77         }while(bt);
78     }
79 }
时间: 2024-08-10 02:03:22

一步两步学算法之中序遍历线索二叉树的相关文章

【数据结构】中序遍历线索二叉树

昨天写了个二叉树遍历,自以为对二叉树很了解了.自大的认为线索二叉树不过是加了点线索而已,不足挂齿.可是当真的自己编程序写的时候才发现完全不是那么容易.在有线索的情况下,如何判别Link类型的下一节点,如何不用栈跳过已访问节点搞得脑子晕晕的. 折腾一个晚上,才根据书上把线索二叉树的建立.中序遍历给写出来.要回去继续好好的理清关系. #include <stdio.h> #include <stdlib.h> typedef enum PointerTag{Link, Thread};

已知二叉树的前序遍历、中序遍历或者中序遍历、后序遍历求二叉树结构的算法

二叉树中的前序遍历是先访问根结点,再访问左子树,右子树. 中序遍历是先访问左子树,再是根结点,最后是右子树. 后序遍历是先访问左子树,再是右子树,最后是根结点. 算法思路是先根据前序遍历的第一个结点或者后序遍历的最后一个结点,查找对应在中序遍历中的位置,就可以确定左子树包含的元素和右子树包含的元素,最后通过递归来实现就可以了. 二叉树的表示形式为 //二叉树的结构表示为 class TreeNode { int val; TreeNode left; TreeNode right; TreeNo

[二叉树建树]1119. Pre- and Post-order Traversals (30) (前序和后序遍历建立二叉树)

1119. Pre- and Post-order Traversals (30) Suppose that all the keys in a binary tree are distinct positive integers. A unique binary tree can be determined by a given pair of postorder and inorder traversal sequences, or preorder and inorder traversa

[LeetCode] Construct Binary Tree from Preorder and Inorder Traversal 由先序和中序遍历建立二叉树

Given preorder and inorder traversal of a tree, construct the binary tree. Note:You may assume that duplicates do not exist in the tree. 这道题要求用先序和中序遍历来建立二叉树,跟之前那道Construct Binary Tree from Inorder and Postorder Traversal 由中序和后序遍历建立二叉树原理基本相同,针对这道题,由于先

leetcode题解:Construct Binary Tree from Inorder and Postorder Traversal(根据中序和后序遍历构造二叉树)

题目: Given inorder and postorder traversal of a tree, construct the binary tree. Note:You may assume that duplicates do not exist in the tree. 说明: 1)实现与根据先序和中序遍历构造二叉树相似,题目参考请进 算法思想 中序序列:C.B.E.D.F.A.H.G.J.I 后序序列:C.E.F.D.B.H.J.I.G.A 递归思路: 根据后序遍历的特点,知道后序

二叉树(15)----由中序遍历和后序遍历重建二叉树,递归方式

1.二叉树定义 typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct BTreeNode_t_ { BTreeNodeElement_t *m_pElemt; struct BTreeNode_t_ *m_pLeft; struct BTreeNode_t_ *m_pRight; } BTreeNode_t; 2.由中序遍历和后序遍历重建二叉树 中序遍历中,根节点总是位于左右子树

利用后序和先序遍历恢复二叉树

利用后序和先序遍历恢复二叉树 ??利用后序和中序遍历可以将二叉树还原出来,以便于进行其他树的操作.在这里我们还原出二叉树之后进行先序遍历来求得先序遍历的结果,我们约定还原树的函数叫做RestoreTree(). 过程 后序遍历实例:C B E H G I F D A 中序遍历实例:B C A E D G H F I 中序遍历开始位置,结束位置记做z1,z2,后序的记为h1,h2 新建一颗空树,左右孩子置空 拿到后序遍历的最后一个结点,其位置为z2,将该值存入树的数据域 在中序遍历的序列中以遍历的

根据先序遍历和中序遍历建立二叉树

title: 根据先序遍历和中序遍历建立二叉树 date: 2019-07-23 22:37:34 tags: 数据结构 问题 已知一棵二叉树的先序遍历以及中序遍历,重建二叉树.二叉树的每一个节点有三个属性,左子节点,右子节点,以及节点值. 思路 先序遍历服从规则“根左右”,所以由此可知,对于一个先序遍历得到的数组,第一个元素一定是根节点: 中序遍历服从规则”左根右“,所以由此可知,对于一个中序遍历得到的数组,根节点左边的元素都属于根节点的左子树,而根节点右边的元素都属于根节点的右子树: 所以,

Construct Binary Tree from Inorder and Postorder Traversal ——通过中序、后序遍历得到二叉树

题意:根据二叉树的中序遍历和后序遍历恢复二叉树. 解题思路:看到树首先想到要用递归来解题.以这道题为例:如果一颗二叉树为{1,2,3,4,5,6,7},则中序遍历为{4,2,5,1,6,3,7},后序遍历为{4,5,2,6,7,3,1},我们可以反推回去.由于后序遍历的最后一个节点就是树的根.也就是root=1,然后我们在中序遍历中搜索1,可以看到中序遍历的第四个数是1,也就是root.根据中序遍历的定义,1左边的数{4,2,5}就是左子树的中序遍历,1右边的数{6,3,7}就是右子树的中序遍历