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 };
  • 相关阅读:
    [转]项目管理---敏捷开发思想---带来相当愉快的项目开发过程
    [转] 项目管理---项目经理如何应对客户的需求变更?
    [转]C# 线程知识--使用Task执行异步操作
    [转]细说ASP.NET的各种异步操作
    [转]oracle表分区详解
    解决Asp.net 部署后弹出登陆框
    SVN客户端TortoiseSVN安装配置图文教程
    .net版本区别及发展历程
    CLR via c#读书笔记九:字符、字符串和文本处理
    CLR via c#读书笔记九:接口
  • 原文地址:https://www.cnblogs.com/LJ-LJ/p/11094199.html
Copyright © 2011-2022 走看看