树:将二叉搜索树转换为排序的双向链表

将二叉搜索树树转换为排序的双向链表,听起来可能是个比较复杂的问题,其实并不是很难。思路如下:

  1. 首先找到头结点,即最左最深处的结点。
  2. 中序遍历。
  3. 更改结点的 left right 指针。

其实总结上面三条即是,用一个指针保存中序遍历中的前一个结点,并将前一个访问的结点的 right 指针指向当前访问结点,把当前访问结点的 left 指针指向前一个访问的结点。
代码如下:

struct TreeNode { // 结点定义
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};

TreeNode* tail = nullptr; // 尾指针用于记录中序遍历时当前访问结点的前一个结点
TreeNode* head = nullptr; // 保存转换后链表的第一个结点(即最左最深处的那个结点)

void ConvertSubTree(TreeNode* pRoot) {
    if (nullptr == pRoot) return;
    ConvertSubTree(pRoot->left); // 转换左子树
    if (nullptr == tail) { // 此段代码只会执行一次,即找到双向链表头结点的时候
        tail = pRoot;
        head = pRoot;
    } else {
        tail->right = pRoot;
        pRoot->left = tail;
        tail = pRoot;
    }
    ConvertSubTree(pRoot->right); // 转换右子树
}

TreeNode* ConvertBT(TreeNode* pRoot) {
    ConvertSubTree(pRoot);
    return head;
}
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页