zoukankan      html  css  js  c++  java
  • [Yahoo][笔试] 把BST转换为双向链表

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

    例如:

                     4

                    /  \

                 1      7

               /  \     / \     

             0     2  5    8

                     \   \    \            

                      3   6    9

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

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

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

     1 #include <iostream>
     2 using namespace std;
     3 
     4 struct Node
     5 {
     6     int val;
     7     Node *left;
     8     Node *right;
     9     Node():left(NULL), right(NULL){}
    10 };
    11 
    12 struct LeftRightNode
    13 {
    14     Node *left;
    15     Node *right;
    16     LeftRightNode(){}
    17     LeftRightNode(Node *l, Node *r):left(l), right(r){}
    18 };
    19 
    20 LeftRightNode convert(Node *node)
    21 {
    22     if (node == NULL)
    23     {
    24         LeftRightNode ret;
    25         return LeftRightNode(NULL, NULL);
    26     }
    27 
    28     LeftRightNode leftTree = convert(node->left);
    29     LeftRightNode rightTree = convert(node->right);
    30 
    31     node->left = leftTree.right;
    32     if (leftTree.right)
    33         leftTree.right->right = node;
    34     
    35     node->right = rightTree.left;
    36     if (rightTree.left)
    37         rightTree.left->left = node;
    38 
    39     Node *leftNode = leftTree.left ? leftTree.left : node;
    40     Node *rightNode = rightTree.right ? rightTree.right : node;
    41     return LeftRightNode(leftNode, rightNode);
    42 }
    43 
    44 Node *convert2List(Node *head)
    45 {
    46     LeftRightNode ret = convert(head);
    47 
    48     return ret.left;
    49 }
    50 
    51 void print(Node *node)
    52 {
    53     while(node)
    54     {
    55         cout << "Node val:" << node->val << " address:" << node << " left:" << node->left << " right:" << node->right << endl;
    56         node = node->right;
    57     }
    58 }
    59 
    60 int main()
    61 {
    62     Node node[10];
    63     for(int i = 0; i < 10; i++)
    64         node[i].val = i;
    65 
    66     node[4].left = &node[1];
    67     node[4].right = &node[7];
    68 
    69     node[1].left = &node[0];
    70     node[1].right = &node[2];
    71 
    72     node[2].right = &node[3];
    73 
    74     node[7].left = &node[5];
    75     node[7].right = &node[8];
    76 
    77     node[5].right = &node[6];
    78 
    79     node[8].right = &node[9];
    80 
    81     Node *head = convert2List(&node[4]);
    82 
    83     print(head);
    84 }
  • 相关阅读:
    从MSFT Project中同步数据到PSA
    TracingService. 码农debug的救星
    Business Workflow Flow 最后一个stage阶段触发Exist
    BPF form 中的readonly 只读字段自动unblock
    Windows Server 使用fiddler中抓取IIS的请求
    Dynamics 365 CE 的快捷键 Shortcut
    Dynamics 365 online 服务器保护机制 server limitation
    在后端C#中 call web api 关联lookup 和 GUID
    PSA 需要 Sales Order中 读取的最低权限 read minimal privilege
    python学习笔记10:分析程序性能cProfile
  • 原文地址:https://www.cnblogs.com/chkkch/p/2745300.html
Copyright © 2011-2022 走看看