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 }
  • 相关阅读:
    Linux基础(14)进程通信 IPCs
    Linux基础(13)进程基础
    Linux基础(10)AIO项目设计与POSIX文件操作和目录管理
    Linux基础(09)aio高级编程
    Linux基础(08)信号通信机制
    Linux基础(06)IO复用
    Linux基础(05)socket编程
    LInux基础(04)项目设计一(理解链表管理协议的代码架构)
    C#关于一个程序,只可以有一种实例的方法
    C#application.exit()和environment.Exit(0)比较
  • 原文地址:https://www.cnblogs.com/tgycoder/p/4954122.html
Copyright © 2011-2022 走看看