二叉排序树转化成双链表

来源:互联网 发布:零式战斗机 知乎 编辑:程序博客网 时间:2024/04/28 05:40

1、二叉排序树定义:
二叉排序树是一棵空树,或者具有以下性质
(1)若左子树不空,那么左子树的所有节点均小于根节点。
(2)若右子树不空,那么右子树中所有节点均大于根节点。
(3)左右子树又是一颗二叉排序树。
2、二叉排序树变成双链表
这里写图片描述
将图中的二叉排序树变成双链表的思路:二叉树操作最常用的是递归算法。如果在左右子树已经是双链表的基础上,将左子树链表、右子树链表以及根节点变成一个双链表我们可以这样做:首先找到左子树链表最右边的元素(最大),右子树链表最左边的元素(最小),将这两个元素与根节点连接,那么就变成了一个双链表了。所以我们首先要做的是将左右子树变成双链表。
步骤:
(1)将左右子树变成双链表。
(2)左右子树链表与根节点进行合并,变成一个双链表。
C++代码实现

struct TreeNode{    int val;    TreeNode *left;    TreeNode *right;    TreeNode(int x):val(x),left(nullptr),right(nullptr) { }};void convert(TreeNode *root) {    if(root == nullptr)        return;    if(root->left == nullptr && root->right == nullptr)        return;    TreeNode *left = root->left;    TreeNode *right = root->right;    //左右子树变成双链表    convert(left);    convert(right);    //将左右子树链表与根节点合并一起    if(left){        while(left->right)            left = left->right;        left->right = root;        root->left = left;    }    if(right){        while(right->left)            right = right->left;        root->right = right;        right->left = root;    }}TreeNode* binaryTreeToDoubleList(TreeNode *root){    if(root == nullptr)        return nullptr;    convert(root);    //将root指向头结点    while(root->left)        root = root->left;    return root;}int main(int argc, char const *argv[]){    shared_ptr<TreeNode> root(new TreeNode(7));    shared_ptr<TreeNode> left(new TreeNode(4));    shared_ptr<TreeNode> right(new TreeNode(10));    shared_ptr<TreeNode> node(new TreeNode(6));    root->left = left.get();    root->right = right.get();    left->right = node.get();    TreeNode *p = binaryTreeToDoubleList(root.get());    while(p != nullptr){        cout << p->val << "\t";        p = p->right;    }    return 0;}
0 0
原创粉丝点击