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

    题目描述:

    输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

    思路分析:

    这道题一开始的思路是借用队列结构,首先中序遍历二叉树,按顺序保存结点,再依次出队列,创建前向后向指针。但由于题目的设定是不允许创建新的结点结构,所以考虑其他方法。

    在做二叉树相关的题时,一般都利用递归完成。本题中需要用一个指向当前链表最后结点的指针来完成,对于每个新输入的树,对左子树做递归操作,保证每次都更新指向当前链表最后结点的指针,那么当完成左子树时,当前根的前向指针(左指针)就指向其左子树链表的最后一个结点,同时去判断最后这个结点是否为空,若不为空,它的后向指针(右指针)就指向当前的根。接下来就更新这个最后结点的指针指向当前的根结点,再对右子树做同样操作。

    参考了一篇博客,说得相对清晰,https://cuijiahua.com/blog/2017/12/basis_26.html

    代码:

     1 /*
     2 struct TreeNode {
     3     int val;
     4     struct TreeNode *left;
     5     struct TreeNode *right;
     6     TreeNode(int x) :
     7             val(x), left(NULL), right(NULL) {
     8     }
     9 };*/
    10 class Solution {
    11 public:
    12     TreeNode* Convert(TreeNode* pRootOfTree)
    13     {
    14         TreeNode* pLastNodeInList = nullptr;
    15         ConvertNode(pRootOfTree, &pLastNodeInList);
    16         
    17         while(pLastNodeInList!=nullptr && pLastNodeInList->left!=nullptr)
    18         {
    19             pLastNodeInList = pLastNodeInList->left;
    20         }
    21         return pLastNodeInList;
    22     }
    23     
    24     void ConvertNode(TreeNode* pRoot, TreeNode** pLastNode)
    25     {
    26         if(pRoot==nullptr)
    27             return;
    28         if(pRoot->left!=nullptr)
    29             ConvertNode(pRoot->left, pLastNode);
    30         pRoot->left = *pLastNode;
    31         if(*pLastNode!=nullptr)
    32         {
    33             (*pLastNode)->right = pRoot;
    34         }
    35         *pLastNode = pRoot;
    36         if(pRoot->right!=nullptr)
    37         {
    38             ConvertNode(pRoot->right, pLastNode);
    39         }
    40     }
    41 };
  • 相关阅读:
    start tag, end tag issues in IE7, particularly in xslt transformation
    用SandCastle为注释生成chm文档
    Firebug
    架构的重点
    Linux Shell常用技巧(十) 管道组合
    Linux JDK升级
    Linux Shell常用技巧(十二) Shell编程
    Packet Tracer 5.0实验(一) 交换机的基本配置与管理
    Linux Shell常用技巧(六) sort uniq tar split
    Linux Shell常用技巧(二) grep
  • 原文地址:https://www.cnblogs.com/LJ-LJ/p/11094199.html
Copyright © 2011-2022 走看看