二叉搜索树->双向有序链表,不能产生新的节点。

来源:互联网 发布:养老金认证软件个人版 编辑:程序博客网 时间:2024/06/14 16:56

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

总结:

1.中序遍历,等前面左子树已经形成”一个好的链表了,再把根节点连上去。

2.深刻体会 ::已经形成 --》所以要采用先序遍历

3.深刻体会 . 要一个变量来记录当前递归中的状态时,该状态能被修改,要“传地址”而不是传值。传值只是形参被修改。

/*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) return NULL;        TreeNode*plastNode=NULL;        ConvertNode(pRootOfTree,&plastNode);        TreeNode*head=plastNode;        while(head->left) head=head->left;        return head;    }    void ConvertNode(TreeNode*pRootOfTree,TreeNode**plastNode){        if(pRootOfTree==NULL) return;        TreeNode* pCurrent=pRootOfTree;        if(pCurrent->left)            ConvertNode(pCurrent->left,plastNode);        pCurrent->left=*plastNode;        if(*plastNode)            (*plastNode)->right=pCurrent;        *plastNode=pCurrent;//如果是传值的话,这里被修改了,那么原值并没有变。        if(pCurrent->right)            ConvertNode(pCurrent->right,plastNode);    }};



0 0