剑指offer -- 二叉搜索树与双向链表

题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向 。返回双向链表的头节点。
分析:
在二叉搜索树中左子节点的值总是小于父亲节点的值,右子节点的值总是大于父亲节点的值。使用中序遍历去遍历二叉搜索树的结果就是一组排序好的数据,我们只需要用指针将节点连接起来。节点的左指针变成指向前一个节点的指针,右指针变成指向后一个节点的指针。我们需要一个pListHead 指针来保存链表的头节点,需要一个pre指针来保存此时遍历到的节点的前一个节点。来帮助我们连接链表中的节点。
在这里插入图片描述

我们以上面的二叉搜索树为例,中序遍历先遍历到节点4,4是链表中的第一个节点,如果pre为NULL就证明我们现在在第一个节点,那么pListHead应该等于root,把pre指向root(4),然后root为6 则root->left为pre(4),pre->right为root(6),接着还是pre指向root(6),root为8,则root->left为pre(6),pre->right为root(8),pre指向root(8),中序遍历的顺序根左右,整棵左子树递归处理完毕以后就到了根节点。同样道理 root为10,pre指向链表尾结点 8 重复上述连接过程,整棵右子树也如此处理。
在这里插入图片描述

class Solution {
private:
	Node* pListHead = NULL;
	Node* pre = NULL;
public:
	Node* treeToDoublyList(Node* root) {
		if(root == NULL) return NULL;

		ReConnectNode(root);
		return pListHead;
	}

	void ReConnectNode(Node* root){
		if(root == NULL) return;
		ReConnectNode(root -> left);
		if(pre == NULL)
			pListHead = root;
		else{
			pre -> right = root;
			root -> left = pre;
		}
		pre = root;
		ReConnectNode(root -> right);
	}
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值