二叉排序树转换成排序的双向链表

输入:一棵二叉排序树

输出:双向链表

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

算法设计思想:

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

源码如下

 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 }
原文地址:https://www.cnblogs.com/tgycoder/p/4954122.html