• 二叉搜索树与双向链表


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

    【思路】注意此题目是将一个二叉搜索树转换成排序的双向链表,如果没有其他要求,我们可以直接对这个二叉树进行中序遍历,就可以得到已经排序好的节点,然后组合成一个双向链表,但题目不允许转换成新的节点!

    尽管如此,仍然可以使用中序遍历的思路,这时我们需要使用一个指针保存前驱节点pre,首先将pre指向当前节点的left,若pre不为空,则修改pre的right指向当前节点,接着让前驱节点向后移动,也就是指向当前节点cur。

    /*
    struct TreeNode {
        int val;
        struct TreeNode *left;
        struct TreeNode *right;
        TreeNode(int x) :
                val(x), left(NULL), right(NULL) {
        }
    };*/
    class Solution {
    public:
        void process(TreeNode* cur, TreeNode*& pre){
            if(cur == nullptr) return;
            process(cur->left, pre);
    
            cur->left = pre;
            if(pre) pre->right = cur;  
            // 如果前驱节点不为空,则将前驱节点的右节点指向当前节点
            pre = cur;
    
            process(cur->right, pre);
        }
    
        TreeNode* Convert(TreeNode* pRootOfTree)
        {
            if(pRootOfTree == nullptr) return nullptr;
            TreeNode* pre = nullptr;  // 声明指针要进行初始化
    
            process(pRootOfTree, pre);
    
            TreeNode* res = pRootOfTree;
            while(res->left){
                res = res->left;
            }
            return res;
        }
    };
  • 相关阅读:
    Design + Code (iOS)
    Objective-C Programming (2nd Edition)
    iOS Programming The Big Nerd Ranch Guide (4th Edition)
    反射
    面向对象
    人狗大战
    数据结构初识(三级菜单)
    面向对象(组合)
    练习
    re模块
  • 原文地址:https://www.cnblogs.com/zhudingtop/p/11346306.html
Copyright © 2020-2023  润新知