zoukankan      html  css  js  c++  java
  • ※剑指offer系列19:二叉搜索树与双向链表

    二叉搜索树的特点是根据中序遍历就是从小到大的顺序。所以要根据左->根->右的顺序进行递归。整体思路就是:按着中序遍历的顺序将树中的每一个结点与前一个结点连接起来。

    递归的时候想一个问题,只要能把两个节点连起来,就能把所有的树的结点连起来。这个题还是很典型。

    在表示尾结点的时候,我还在想这个使用一个指针不也可以吗,结果调试了发现不行。因位如果使用指针表示尾结点,则在递归的过程中不会更新这个尾结点的值。具体来说,就是在递归中,如果进入一个一个递归循环,则原先未完成的函数的参数会被暂存下来,等递归结束之后再把这个暂存的状态拿出来计算。但是在这个题中,我们不希望将尾结点plastnode的值暂存下来,我们希望它随波逐流,运行到哪里就是哪里的结果。因此这是它和头结点指针的区别,使用双重指针恰好可以解决这个问题。所以由此,如果在递归的过程中你所传的指针参数的值要一直变化,可以使用双重指针的方式。二级指针是C语言的写法,在C++中可以使用引用来代替。

     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 struct TreeNode {
     6 int val;
     7 struct TreeNode *left;
     8 struct TreeNode *right;
     9 /*
    10 TreeNode(int x) :
    11 val(x), left(NULL), right(NULL) {
    12 }*/
    13 };
    14 class Solution {
    15 public:
    16     TreeNode* Convert(TreeNode* pRootOfTree)
    17     {
    18         if (pRootOfTree == NULL)
    19             return NULL;
    20         TreeNode*plastnode = NULL;
    21         Convertnode(pRootOfTree, &plastnode);
    22         while (plastnode != NULL&& plastnode->left!=NULL)//函数没有返回值,只能从尾结点倒着去找头结点
    23         {
    24             plastnode = plastnode->left;
    25         }
    26         return plastnode;
    27     }
    28     void Convertnode(TreeNode* pRootOfTree, TreeNode**  plastnode)//注意,这里在表示末尾结点使用的是指针的指针,因为这样可以在递归的过程中一直更新
    29     {
    30         //if (pRootOfTree == NULL)
    31         //    return;
    32         TreeNode *curnode = pRootOfTree;//设置一个当前结点
    33 
    34         //先找完左子树
    35         if (curnode->left != NULL)
    36             Convertnode(curnode->left, plastnode);
    37 
    38         //将结点加入序列中的最后
    39         curnode->left=*plastnode;
    40         if (*plastnode != NULL)
    41             (*plastnode)->right = curnode;//必须加括号,别忘记符号的优先级
    42         *plastnode=curnode;
    43 
    44         //如果有右子树再去递归右子树,将右子树的结点加入序列的尾部
    45         if (curnode->right != NULL)
    46             Convertnode(curnode->right, plastnode);
    47     }
    48 };
    49 
    50 int main()
    51 {
    52     //       10
    53     //  6          14
    54     //4   8     12     16
    55     TreeNode tree[7];
    56     tree[0].val = 10;
    57     tree[0].left = &tree[1];
    58     tree[0].right = &tree[2];
    59     tree[1].val = 6;
    60     tree[1].left = &tree[3];
    61     tree[1].right = &tree[4];
    62     tree[2].val = 14;
    63     tree[2].left = &tree[5];
    64     tree[2].right = &tree[6];
    65     tree[3].val = 4;
    66     tree[3].left = NULL;
    67     tree[3].right = NULL;
    68     tree[4].val = 8;
    69     tree[4].left = NULL;
    70     tree[4].right = NULL;
    71     tree[5].val = 12;
    72     tree[5].left = NULL;
    73     tree[5].right = NULL;
    74     tree[6].val = 16;
    75     tree[6].left = NULL;
    76     tree[6].right = NULL;
    77 
    78     Solution solu;
    79     TreeNode *head = solu.Convert(tree);
    80     while (head != NULL)
    81     {
    82         cout << head->val << " ";
    83         head = head->right;
    84     }
    85     return 0;
    86 }
  • 相关阅读:
    iOS开发——高级篇——iOS中常见的设计模式(MVC/单例/委托/观察者)
    object_getClassName swift得到类名
    UIGestureRecognizerDelegate设置响应事件优先级
    String to Double in swift
    Unable to boot device in current state:Booted
    xcode Indexing | Loading index...
    swift String to UTF8编码
    进入沙盒目录
    swift objective-c混编操作
    storyboard plain style unsupported in a navigation item
  • 原文地址:https://www.cnblogs.com/neverland0718/p/11078058.html
Copyright © 2011-2022 走看看