面试题27:二叉搜索树和双向链表

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

       开始没什么思路。但是想到二叉树的所有题目几乎都可以用递归来做。就想到先找根节点。考虑根节点的左边,根节点肯定是连接左子树的最大值点,想到先找根节点的左子树的最大节点。然后找右子树的最小节点,一连起来,再递归,想到就可以实现了。但是写程序的时候发现有点复杂,于是看了书上的代码,书上定义了一个最后的连接节点,直接递归就可以写。代码如下:

       

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;
        TreeNode* lastNode=NULL;
        Convert(pRootOfTree,&lastNode);
        TreeNode* newHead=lastNode;
        while(newHead!=NULL&&newHead->left!=NULL)
        {
           
            newHead=newHead->left;
        }
        return newHead;    
    }
    void Convert(TreeNode* pRootOfTree,TreeNode** lastNode)
    {
        TreeNode* curNode=pRootOfTree;
        if(curNode==NULL)
            return;
        if(curNode->left)
            Convert(curNode->left,lastNode);
        curNode->left=*lastNode;
        if(*lastNode!=NULL)
            (*lastNode)->right=curNode;
        *lastNode=curNode;
        if(curNode->right)
            Convert(curNode->right,lastNode);
    }
};
         开始纠结为什么要传递最后节点的地址?而不是直接传送最后节点的指针呢。于是我调试了一下。

         考虑树10,6,14,4,8,12,16。如果是直接传送最后节点的指针。当进入了(6,NULL)循环时,此时ConvertNode(4,NULL),在循环中,可以将pLastNode赋予4,但是在跳出循环后,curNode->left=lastNode,此时的lastNode值还是NULL,并不是4,这显然是不对的。因此此处注意要使用最后指针的地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值