二叉搜索树转换为双向链表

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。


思路:

方法一:非递归版
解题思路:
1 .核心是中序遍历的非递归算法。
2 .修改当前遍历节点与前一遍历节点的指针指向。
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
	val(x), left(NULL), right(NULL) {
	}
};
class Solution {
public:
	TreeNode* Convert(TreeNode* pRootOfTree)
	{

		if(pRootOfTree==NULL)
			return NULL;
		stack<TreeNode*> sta;
		TreeNode* p = pRootOfTree;
		TreeNode* pre = NULL,*root;// pre用于保存中序遍历序列的上一节点
		bool isFirst = true;
		while(p!=NULL||!sta.empty()){
			while(p!=NULL){
				sta.push(p);
				p = p->left;
			}
			p = sta.top();
			sta.pop();
			if(isFirst){
				root = p;// 将中序遍历序列中的第一个节点记为root
				pre = root;
				isFirst = false;
			}
			else{
				pre->right = p;
				p->left = pre;
				pre = p;
			}       
			p = p->right;
		}
		return root;
	}
};
方法二:递归版
解题思路:
1 .将左子树构造成双链表,并返回链表头节点。
2 .定位至左子树双链表最后一个节点。
3 .如果左子树链表不为空的话,将当前root追加到左子树链表。
4 .将右子树构造成双链表,并返回链表头节点。
5 .如果右子树链表不为空的话,将该链表追加到root节点之后。
6 .根据左子树链表是否为空确定返回的节点。
public TreeNode Convert(TreeNode root) {
	if(root==null)
		return null;
	if(root.left==null&&root.right==null)
		return root;
	// 1.将左子树构造成双链表,并返回链表头节点
	TreeNode left = Convert(root.left);
	TreeNode p = left;
	// 2.定位至左子树双链表最后一个节点
	while(p!=null&&p.right!=null){
		p = p.right;
	}
	// 3.如果左子树链表不为空的话,将当前root追加到左子树链表
	if(left!=null){
		p.right = root;
		root.left = p;
	}
	// 4.将右子树构造成双链表,并返回链表头节点
	TreeNode right = Convert(root.right);
	// 5.如果右子树链表不为空的话,将该链表追加到root节点之后
	if(right!=null){
		right.left = root;
		root.right = right;
	}
	return left!=null?left:root;        
}





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值