c++ 最简单的解法

二叉搜索树与双向链表

http://www.nowcoder.com/questionTerminal/947f6eb80d944a84850b0538bf0ec3a5

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/
class Solution {
public:
    vector<TreeNode*> listnode;
    void dfs(TreeNode* pRootOfTree)
    {
        if(pRootOfTree!=NULL) 
        {  dfs(pRootOfTree->left);     
        listnode.push_back(pRootOfTree);

            dfs(pRootOfTree->right);}
    }
    TreeNode* Convert(TreeNode* pRootOfTree) {
        if(pRootOfTree==NULL) return pRootOfTree;
        dfs(pRootOfTree);
        int m = listnode.size();
         for(int i = 0; i<m ; i++)
        {
            if(i<m-1) listnode[i]->right = listnode[i+1];
            if(i>0) listnode[i]->left = listnode[i-1];
        }
        return listnode[0];
    }
};

由于二叉搜索树的特性,左子树<根<右子树,那么当我们用中序遍历时遍历的顺序会是递增的。
我们用一个vector将节点存下来,后面按照顺序调整链接即可。
这里进行遍历时要注意,节点非空再往下遍历,我一开始写的是

if(pRootOfTree->left!=NULL) dfs(pRootOfTree->left);    
listnode.push_back(pRootOfTree);
if(pRootOfTree->right!=NULL) dfs(pRootOfTree->right);}

一直出段错误,原因是

全部评论

相关推荐

点赞 评论 收藏
转发
3 收藏 评论
分享
牛客网
牛客企业服务