【树】二叉搜索树与双向链表

大致思路:

其实这种二叉树的题大多都用“递归”解决。只是这道题刚开始我没找到递归的思路。

如果有多个结点在子树中,就需要找清楚到底哪个才是根节点的前后结点。如:

可以知道,这显然就是按照树的中序遍历来的嘛。。

然后。。。分析了半天。。。因为二叉排序树的中序遍历本来就是有序的,所以其实就是中序遍历,只是要考虑个pre结点把前后关系连起来而已!!

这个代码我也是研究了一会儿的,注意pre指针是引用可变的。代码结构是中序遍历的结构,只是要搞清楚我当前要做什么,pre指针应该怎么变化。

AC代码:

/*
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;
        }
        if(pRootOfTree->left==NULL && pRootOfTree->right==NULL)
            return pRootOfTree;
        
        TreeNode* pre = NULL;
        convert_recursive(pRootOfTree,pre); //初始的pre值是null
        
        TreeNode* p = pRootOfTree;
        while(p->left)
            p=p->left;
        return p; //结果链表的头结点是树的最左下方的结点
    }
    
    void convert_recursive(TreeNode* t, TreeNode* &pre) //注意pre要加引用
    {
        if(t==NULL) 
            return;
        
        convert_recursive(t->left,pre);
        
        //仿照中序遍历,这里是主要的操作:
        t->left=pre; //注意,这里要理解到!!!要等左子树以同样逻辑得到的pre作为本根节点的在链表中的上一个元素
        if(pre) pre->right = t; //注意是双向链表!
        pre = t; //这步也很关键
        
        convert_recursive(t->right,pre);
    }
};




猜你喜欢

转载自blog.csdn.net/m0_38033475/article/details/91993909