如何在二叉树上加上中序遍历线索~~~~

yhlm1994 2013-11-14 01:21:06
如图所示二叉树:

怎么在树上加上中序遍历线索????求详细解题步骤~~~~~ 求帮忙~~~
...全文
216 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
JiMoKuangXiangQu 2013-11-15
  • 打赏
  • 举报
回复
引用 2 楼 u012257679 的回复:
[quote=引用 楼主 u012257679 的回复:] 如图所示二叉树: 怎么在树上加上中序遍历线索????求详细解题步骤~~~~~ 求帮忙~~~
额···· 不是要代码··· 要的是线索化之后的图[/quote] 这个很简单啊,线索二叉树无非就是每个带空指针的节点,让其空指针指向前驱(lchild)或者后续节点(rchild)就可以了。 中序遍历的顺序为: DHBEAFCJIKG 在每个节点前面的就是其前驱,在每个节点后面的就是其后续。这样只要某个节点的左或者右孩子为空: 如果左孩子为空,就让其左孩子指向前驱节点,如果没有前驱节点就继续指向空; 如果右孩子为空,就让其右孩子指向后续节点,如果没有后续节点就继续指向空。 节点D,中序遍历是第一个节点,前驱为空,所以左孩子继续为空,后续节点指向H; 节点G,中序遍历是最后第一个节点,前驱为K,所以将其左孩子指向G,而其右孩子继续为空,因为没有后续节点A,B,C,I,左右孩子均齐全,不用处理; 节点EFHIJK,分别在孩子为空的填上对应前驱后继即可。
JiMoKuangXiangQu 2013-11-15
  • 打赏
  • 举报
回复
yhlm1994 2013-11-14
  • 打赏
  • 举报
回复
引用 楼主 u012257679 的回复:
如图所示二叉树: 怎么在树上加上中序遍历线索????求详细解题步骤~~~~~ 求帮忙~~~
额···· 不是要代码··· 要的是线索化之后的图
JiMoKuangXiangQu 2013-11-14
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>


typedef struct threaded_binary_tree btthreaded_t;
typedef void (*visitor_t)(btthreaded_t *);
typedef char bt_elem_t;


struct threaded_binary_tree {
	btthreaded_t	*l, *r;
	int				ltag, rtag; /* tag=0: child; tag=1: threaded */
	bt_elem_t		e;
};


#define NIL_ELEM(e) ((e) == ' ')


void btthreaded_create(btthreaded_t** root, bt_elem_t** elems, int* elemnum)
{
	if (*elemnum == 0) return; // no more elements

	if (NIL_ELEM(**elems)) {
		*root = NULL;
		(*elems)++; (*elemnum)--;
	} else {
		// m-node
		*root = (btthreaded_t*)malloc(sizeof(btthreaded_t));
		(*root)->e = *(*elems)++; (*elemnum)--;
		(*root)->ltag = (*root)->rtag = 0;
		// (l, r)-nodes
		btthreaded_create(&((*root)->l), elems, elemnum); // l-tree
		btthreaded_create(&((*root)->r), elems, elemnum); // r-tree
	}
}

void inorder_travel(btthreaded_t* root, visitor_t visitor)
{
	if (root == NULL) return;

	inorder_travel(root->l, visitor);
	if (visitor) visitor(root);
	inorder_travel(root->r, visitor);
}

static void do_thread(btthreaded_t* root, btthreaded_t** prev)
{
	assert(prev);

	if (root)
	{
		do_thread(root->l, prev);
		if (root->l == NULL) { // the previous
			root->ltag = 1;
			root->l = *prev;
		}
		if (*prev && (*prev)->r == NULL) { // the posterior
			(*prev)->rtag = 1;
			(*prev)->r = root;
		}
		*prev = root;
		do_thread(root->r, prev);
	}
}

void inorder_thread(btthreaded_t* root)
{
	btthreaded_t *prev;

	if (root == NULL) return;

	prev = NULL;
	do_thread(root, &prev);
	prev->r = NULL;
	prev->rtag = 1;
}


void print_node(btthreaded_t *node)
{
	if (node == NULL) return;

	putchar(node->e);

	//putchar(node ? node->e : ' ');
}


int main(void)
{
	btthreaded_t *root = NULL;
	/*      A
	 *     / \
	 *    B   C
	 *   /   / \
	 *  D   E   F
	 */
	bt_elem_t *elems = "ABD   CE  F  ";
	size_t elemnum = strlen(elems);
	visitor_t visitor = print_node;

	btthreaded_create(&root, &elems, &elemnum);
	inorder_travel(root, print_node);
	inorder_thread(root);

	getch();
	return 0;
}
供参考。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧