troubleasy

导航

 

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

思路:中序遍历二叉搜索树递归与非递归方式

    TreeNode* Convert(TreeNode* pRootOfTree)
    {
        //中序遍历
        //left指向前一个节点,right指向后一个节点
        //非递归
        if(pRootOfTree==NULL) return pRootOfTree;
        TreeNode*p,*pre,*proot;
        stack<TreeNode*>st;
        bool flag=false;
        p=pRootOfTree;
        do{
            while(p!=NULL)
            {
                st.push(p);
                p=p->left;
            }
            if(!st.empty())
            {
                p=st.top();
                if(pre!=NULL)
                {
                    p->left=pre;
                    pre->right=p;
                }
                pre=p;
                if(!flag)
                {
                    proot=p;
                    flag=true;
                }
                st.pop();
                //if(p->right!=NULL)
                p=p->right;
            }
        }while(p!=NULL||!st.empty());
            return proot;
    }

//递归

    TreeNode* Convert(TreeNode* pRootOfTree)
    {

       if(pRootOfTree==NULL)return NULL;
        TreeNode*pre=NULL,*p=pRootOfTree;
        ConvertHelper(pRootOfTree,pre);
        while(p->left!=NULL)
        {
            p=p->left;
        }
        return p;
    }
    void ConvertHelper(TreeNode* root,TreeNode*&pre)
    {
        if(root==NULL)return;
        ConvertHelper(root->left,pre);
        root->left=pre;
        if(pre)pre->right=root;
        pre=root;
        ConvertHelper(root->right,pre);
    }

 

posted on 2020-05-26 23:53  troubleasy  阅读(104)  评论(0)    收藏  举报