[C++]-二叉搜索树与双向链表

本题来自牛客 二叉搜索树与双向链表_牛客题霸_牛客网 (nowcoder.com)

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示

要求在原树上进行操作,不可以创建新的节点,大大提高了本题的难度。

 本题做法记录树最左侧节点开始,首先将其left置为nullptr,使用双指针,cur首先指向4,pre指向nullptr,然后将cur指向其父节点6,然后连接cur->left = pre,则pre现在为4,将pre->right  = cur,将pre = cur,依次连接。最后返回双向的最左端即可。

走到节点4的时候 cur = 节点4.然后对cur->left = nullptr,然后走cur->right=nullptr。

接下来返回到节点6,链接4和6。然后走节点6的right节点8,节点8的左子树为空,直接走完之后链接6和8,然后走节点8的右子树直接返回。依次链接所有节点

 代码如下:

void InOrderConvert(TreeNode* cur,TreeNode*& prev)
	{
		if(cur == nullptr)
			return;
		
		InOrderConvert(cur->left, prev);

		cur->left = prev; 
		if(prev)
			prev->right = cur;
		prev = cur;

		InOrderConvert(cur->right, prev);
	}

 然后再走到根节点10的最左端返回即可

TreeNode* head = pRootOfTree;
		while(head && head->left)
			head = head->left;

总代码如下

/*
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};*/
class Solution {
public:
	void InOrderConvert(TreeNode* cur,TreeNode*& prev)
	{
		if(cur == nullptr)
			return;
		
		InOrderConvert(cur->left, prev);

		cur->left = prev; 
		if(prev)
			prev->right = cur;
		prev = cur;

		InOrderConvert(cur->right, prev);
	}


    TreeNode* Convert(TreeNode* pRootOfTree) {
		TreeNode* prev = nullptr;
		InOrderConvert(pRootOfTree,prev);

		TreeNode* head = pRootOfTree;
		while(head && head->left)
			head = head->left;

        return head;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值