美文网首页
BST与双向链表

BST与双向链表

作者: 宫若石 | 来源:发表于2019-04-02 09:30 被阅读0次

把BST转换为双向链表

给出一棵BST,将其转换为双向链表,left保存前节点,right保存后节点。

例如:

                4

                /  \

            1      7

          /  \    / \   

        0    2  5    8

                \  \    \           

                  3  6    9

变为:0<->1<->2<->3<->4<->5<->6<->7<->8<->9.

解答:这里我们可以看到一个节点的左子树的最后节点就是本节点的前驱,右子树的最左节点就是后继。于是需要一个函数能够返回这样的需求,也就有了一个可以返回本棵树的左右节点的函数。

同时,在细节上进行一些处理。

#include <iostream>

using namespace std;

struct Node  {

    int val;

    Node *left;

    Node *right;

    Node():left(NULL), right(NULL){}

};

struct LeftRightNode

{

    Node *left;

    Node *right;

    LeftRightNode(){}

                    LeftRightNode(Node *l, Node *r):left(l), right(r){}

};

LeftRightNode convert(Node *node)

{

    if (node == NULL)

    {

        LeftRightNode ret;

        return LeftRightNode(NULL, NULL);

    }

LeftRightNode leftTree = convert(node->left);

LeftRightNode rightTree = convert(node->right);

      node->left = leftTree.right;

    if (leftTree.right)

        leftTree.right->right = node;

        node->right = rightTree.left; if (rightTree.left)

        rightTree.left->left = node;

Node *leftNode = leftTree.left ? leftTree.left : node;

Node *rightNode = rightTree.right ? rightTree.right : node;

return LeftRightNode(leftNode, rightNode);

}

Node *convert2List(Node *head)

{

      LeftRightNode ret = convert(head);                return ret.left;

}

void print(Node *node)

{

    while(node)

    {   

cout << "Node val:" << node->val << " address:" << node << " left:" << node->left << " right:" << node->right << endl;            node = node->right; 

    }

}

    int main()

  {

          Node node[10];

          for(int i = 0; i < 10; i++)

              node[i].val = i;

          node[4].left = &node[1];

          node[4].right = &node[7];

          node[1].left = &node[0];

          node[1].right = &node[2];

          node[2].right = &node[3];

        node[7].left = &node[5];

        node[7].right = &node[8];

        node[5].right = &node[6];

        node[8].right = &node[9];

        Node *head = convert2List(&node[4]);

        print(head);

}

相关文章

  • BST与双向链表

    把BST转换为双向链表 给出一棵BST,将其转换为双向链表,left保存前节点,right保存后节点。 例如: ...

  • 426. Convert Binary Search Tree

    BST转双向链表。输入一颗BST,将BST转换成一个排序的循环双向链表,要求不能创建任何新的节点,只能调整树中节点...

  • 1.路径之和 2.最近公共祖先 3.是否后序bst 4.二叉树转

    3.是否是bst的后续便利 4.二叉树转链表 5.bst转双向链表 6.第k小的元素 7.序列化8.删除bst一个点

  • 链表

    链表 缺点:查找复杂有点:定点删除/插入元素 单链表 双向链表 循环链表 双向循环链表 数组与链表的区别 数据存储...

  • 双向链表&双向循环链表

    链表分为:单链表、单向循环链表、双向链表、双向循环链表本节主要说明:双向链表、双向循环链表 定义结点 一、双向链表...

  • 线性表-双向链表与双向循环链表

    双向链表 双向链表示意图如下: 数据结构定义 创建双向链表 双向链表插入元素 双向链表删除元素 双向链表打印元素 ...

  • 线性表 — 链表存储

    链表存储 链表存储特点:不连续的,数据与数据的关系通过指针域连接。链表存储方式:单链表、循环链表、双向链表、双向循...

  • day03-双向链表

    双向链表: 单向链表只能单向查找,双向链表可以双向查找。 啥是双向链表? 双向链表可以双向查数据,所以就不存在单向...

  • 线性表--链式存储结构--双向链表

    双向链表 一、双向链表结构 双向链表结点结构 既然单链表可以有循环链表,那么双向链表当然也可以有。 由于这是双向链...

  • 双向链表和双向循环链表

    双向链表 线性表-双向链表的结点结构: 带头结点的双向链表: 1.双向链表初始化 2.遍历双向链表 2.双向链表插...

网友评论

      本文标题:BST与双向链表

      本文链接:https://www.haomeiwen.com/subject/jthamqtx.html