zoukankan      html  css  js  c++  java
  • 二叉排序树转换成排序的双向链表

    输入:一棵二叉排序树

    输出:双向链表

    要求:不能创建任何新的结点,只调整指针的指向。

    算法设计思想:

    • 构造一棵二叉排序树。
    • 中序遍历二叉排序树,在访问结点时调整成一个双向链表的结点,即将其左右孩子指针转化成前驱和后继指针。

    源码如下

     1 #include"stdafx.h"
     2 #include <iostream>
     3 using namespace std;
     4 
     5 struct  BSTNode
     6 {
     7     int m_Value;
     8     BSTNode *leftChild;
     9     BSTNode *rightChild;
    10 
    11 };
    12 
    13 void AddBSTNode(BSTNode *&pNode, int value);
    14 void InorderBST(BSTNode *BST);
    15 void ConvertToDLinkList(BSTNode *pNode);
    16 BSTNode *pHead = nullptr;
    17 BSTNode *preNode = nullptr;
    18 
    19 int main()
    20 {
    21     BSTNode *pRoot = nullptr;
    22     AddBSTNode(pRoot, 10);
    23     AddBSTNode(pRoot, 6);
    24     AddBSTNode(pRoot, 14);
    25     AddBSTNode(pRoot, 4);
    26     AddBSTNode(pRoot, 8);
    27     AddBSTNode(pRoot, 12);
    28     AddBSTNode(pRoot, 16);
    29     BSTNode *tmpRoot = pRoot;
    30     InorderBST(tmpRoot);
    31 }
    32 
    33 void AddBSTNode(BSTNode *&pNode, int value)
    34 {
    35     if (pNode == nullptr)
    36     {
    37         BSTNode *tempNode = new BSTNode();
    38         tempNode->m_Value = value;
    39         tempNode->leftChild = nullptr;
    40         tempNode->rightChild = nullptr;
    41         pNode = tempNode;
    42     }
    43     else if (pNode->m_Value < value)
    44     {
    45         AddBSTNode(pNode->rightChild, value);
    46     }
    47     else if (pNode->m_Value > value)
    48     {
    49         AddBSTNode(pNode->leftChild, value);
    50     }
    51     else
    52     {
    53         cout << "该结点已经存在,勿重复添加
    ";
    54     }
    55 }
    56 
    57 void InorderBST(BSTNode *BST)
    58 {
    59     if (BST == nullptr)
    60         return;
    61     InorderBST(BST->leftChild);
    62     //cout << BST->m_Value;
    63     ConvertToDLinkList(BST);
    64     InorderBST(BST->rightChild);
    65 }
    66 
    67 void ConvertToDLinkList(BSTNode *pNode)
    68 {
    69     pNode->leftChild = preNode;
    70     if (nullptr == preNode)
    71     {
    72         pHead = pNode;
    73     }
    74     else
    75     {
    76         preNode->rightChild = pNode;
    77     }
    78     preNode = pNode;
    79     cout << pNode->m_Value << ' ';
    80 }
  • 相关阅读:
    Tiny-Core-Linux 9.x:安装oracle【11g|】:艰难的旅程,不过,最终成功了!:mini-install
    调研高层次人才落户的补贴标准
    充当好基层治理的“绣花针”
    对互联网广告监管的几点实践与思考
    合抱之木,生于毫末;九层之台
    JVM
    Apex Salesforce
    maven 地址
    JVM
    使用jmap和MAT进行堆内存溢出分析
  • 原文地址:https://www.cnblogs.com/tgycoder/p/4954122.html
Copyright © 2011-2022 走看看