算法学习 - 线索二叉树
线索二叉树
线索二叉树就是在通用的二叉树里多了点东西,多了什么呢? 前驱和后继,把二叉树变成一个链式的结构。解释下:通常我们的二叉树里,叶子节点是没有孩子,所以指向空也就是NULL
,在线索二叉树里,叶子节点的左右孩子分别指向它自己的前驱和后继,而前驱和后继是哪个节点呢?
就是树遍历过程的前一个节点和后一个节点。所以第一个遍历的节点是没有前驱的,最后一个节点是没有后继的。这里一般都是中序线索二叉树,当然也有先序线索二叉树和后序线索二叉树。
[]a[]
/ []b[] []c[]
/ \
[]d[] []e[]
上面是一个二叉树,我在每个节点两边都添加了一个标签[]
这个标签里面我暂时还没添内容,里面只有两种值,一个是0
一个是1
,当节点有孩子节点的时候,为0
,没有孩子的时候为1
。
所以节点的结构体为:
typedef struct TreeNode* node; struct TreeNode{ node lchild; int ltag; int rtag; node rchild; int data; };
当为0
的时候,指向孩子节点,为1
的时候指向前驱或者后继。
下面附上代码。
代码实现
代码如下:
node Pre = NULL; void InOrderTree(node n){ if (n == NULL) { }else{ // Pre = n; if (n->lchild != NULL) { n->ltag = 0; InOrderTree(n->lchild); }else{ n->ltag = 1; n->lchild = Pre; } if (Pre!=NULL && Pre->rchild == NULL) { Pre->rtag = 1; Pre->rchild = n; } Pre = n; if (n->rchild != NULL) { n->rtag = 0; InOrderTree(n->rchild); }else{ n->rtag = 1; } } }
测试代码(main):
int main(int argc, const char * argv[]) { node head = (node)malloc(sizeof(struct TreeNode)); head->data = 1; node node1 = (node)malloc(sizeof(struct TreeNode)); node node2 = (node)malloc(sizeof(struct TreeNode)); node node3 = (node)malloc(sizeof(struct TreeNode)); node node4 = (node)malloc(sizeof(struct TreeNode)); node1->data = 2; node2->data = 3; node3->data = 4; node4->data = 5; head->lchild = node1; head->rchild = node2; node1->lchild = node3; node1->rchild = node4; node2->lchild = NULL; node2->rchild = NULL; node3->lchild = NULL; node3->rchild = NULL; node4->lchild = NULL; node4->rchild = NULL; InOrderTree(head); return 0; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。