二叉查找树转为双向链表

对于二叉查找树本能的想到了中序遍历,中序遍历二叉树的结果是有序的,只要使用非递归中序遍历,中间稍作修改应该就可以。这个是第一反应,觉得应该不难。

        不过还是,网上搜索一下,在网易何海涛的技术博客中看到,关于递归的解法。这个方法虽然有些耗资源,但是我觉得第一个 想到的应该是这一个,应为二叉树本来就是递归结构,二叉树很多问题的解决都是从递归入手。

下面还是梳理一下这两个思路:

1、非递归方法:中序遍历二叉查找树的结果是有序的,写出二叉树的中序非递归算法,在每次访问该节点的时候,改为将节点加入链表。

        2、递归方法:先将左子树形成链表,返回该链表的最后一个节点;再将右子树形成链表,并返回该链表的第一个节点;将左子树链表、节点、右子树链表连接起来,形成整个链表。


第一种思路代码:

Node* Tree::toList()
{
	stack<Node *> stack;
	Node *p = root;
	Node *head = 0;
	Node *tail = 0;
	while (p != 0 || !stack.empty()) {
		while (p != 0) {
			stack.push(p);
			p = p->left;
		}

		p = stack.top();
		stack.pop();
		if (head == 0) {
			head = p;
			tail = p;
		} else {
			tail->right = p;
			p->left = tail;
			tail = p;
		}
		p = p->right;
	}
	return head;
}

第二种思路的代码:

Node * Tree::convert(Node *node, bool isRight)
{
	if (node == 0)
		return 0;
	Node *pleft = 0;
	Node *pright = 0;
	if (node->left != 0) {
		pleft = convert(node->left, false);
	}

	if (pleft != 0) {
		node->left = pleft;
		pleft->right = node;
	}

	if (node->right != 0) {
		pright = convert(node->right, true);
	}

	if (pright != 0) {
		node->right = pright;
		pright->left = node;
	}

	Node *ptem;
	if (isRight) {
		while (node->left) 
			node = node->left;
		ptem = node;
	} else {
		while (node->right != 0)
			node = node->right;
		ptem = node;
	}

	return ptem;
}



Node * Tree::convert()
{
	return convert(root, true);
}


参考:

http://zhedahht.blog.163.com/blog/static/254111742007127104759245/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值