剑指offer——二叉查找树与双向链表(36题)

题目:输入一棵二叉查找树,将该二叉查找树换成一个排序的双向链表,要求不能创建任何新的节点,只能调整树中节点指针的指向。

解题思想:又一是道二叉树遍历算法的变型题,一定要往这个方向上面思考。此处采用中序遍历(主体)算法进行解题。

#include<iostream>

using namespace std;

struct TreeNode {
	int val;
	TreeNode* left, *right;
	TreeNode(int x):val(x),left(nullptr),right(nullptr){}
};

//以下这个函数主体思想还是中序遍历
void convertNode(TreeNode* root,TreeNode* &pLastNodeInList) {
	if (!root)
		return ;
	TreeNode* current = root;
	
	//递归进左子树中
	if (root->left)
		convertNode(root->left, pLastNodeInList);

	//将尾结点与当前结点连接,构建双向链表
	current->left = pLastNodeInList;
	if (pLastNodeInList)
		pLastNodeInList->right = current;
	pLastNodeInList = current;//将双向链表的尾节点更改为当前结点

	//递归进右子树中
	if (root->right)
		convertNode(root->right,pLastNodeInList);
}

TreeNode* convert(TreeNode* root) {
	if (!root)
		return nullptr;
	
	TreeNode* pLastNodeInList = nullptr;
	convertNode(root, pLastNodeInList);

	//由pLastNodeInList所指向开头的节点向左的链
	while (pLastNodeInList->left) {
		pLastNodeInList = pLastNodeInList->left;
	}
	return pLastNodeInList;
}


//验证部分
void Traverse(TreeNode* root) {
	if (!root)
		return;
	cout << root->val << " ";
	if (root->right)
		Traverse(root->right);
}

int main() {
	TreeNode a(10), b(6), c(14), d(4), e(8), f(12), g(16);
	a.left = &b;
	a.right = &c;
	b.left = &d;
	b.right = &e;
	c.left = &f;
	c.right = &g;

	TreeNode* cur = convert(&a);
	Traverse(cur);

	return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值