二叉搜索时与双向链表python_剑指offer_36_二叉搜索树与双向链表

2526751c5a084684266c37fce5089505.png

//面试题36.二叉搜索树与双向链表

//题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。

//要求不能创建任何新的节点,只能调整树中结点指针的指向。比如,输入图4.15中左边的二叉搜索树,

//输出转换之后的排序双向链表。二叉搜索树的节点定义如下:

/*

struct BinaryTreeNode

{

int m_nValue;

BinaryTreeNode* m_pLeft;

BinaryTreeNode* m_pRight;

};

*/

/*

图4.15

二叉搜索树如下:

10

6 14

4 8 12 16

输出的排序双向链表如下:

4 <=> 6 <=> 8 <=> 10 <=> 12 <=> 14 <=>16

*/

/*

思路:

二叉搜索树的特点是,所有左子节点 < 根结点,所有右子节点 > 根结点。针对题目中要求的排序的双向链表,对二叉树可以采用中序遍历。

对于中序遍历可以将树分为三部分,第一部分是左子树,即上述的4 <=> 6 <=> 8,根结点10,右子树12 <=> 14 <=>16。把左右子树都转换成双向链表之后,再将左子树

中最大的节点(8)与根结点连接起来,将右子树中最小的节点(12)与根结点连接起来,整棵二叉搜索树便转换称为一个排序的双向链表。

对于左右子树的转换,可以采用递归。

*/

#include<iostream>

#include"binarytreen.h"

using namespace std;

void ConvertNode(BinaryTreeNode*pNode, BinaryTreeNode**pLastNodeInList);

BinaryTreeNode* Convert(BinaryTreeNode*pRoot)

{

BinaryTreeNode*pLastNodeInList = nullptr;//pLastNodeInList 指的是已经转换好的链表的最后的一个节点

ConvertNode(pRoot, &pLastNodeInList);

//pLastNodeInList 指的是已经转换好的链表的最后的一个节点

BinaryTreeNode*pHeadOfList = pLastNodeInList;

while (pHeadOfList != nullptr&&pHeadOfList->m_pLeft != nullptr)//我们需要返回头节点

pHeadOfList = pHeadOfList->m_pLeft;

return pHeadOfList;

}

void ConvertNode(BinaryTreeNode*pNode, BinaryTreeNode**pLastNodeInList)

{

if (pNode == nullptr)

return;

BinaryTreeNode*pCurrent = pNode;//传入根结点

//1、递归转换左子树

if (pCurrent->m_pLeft != nullptr)

ConvertNode(pCurrent->m_pLeft, pLastNodeInList);

//2、将转换好的左子树的最后一个节点*pLastNodeInList与根结点连接,注意连接是个双向的,因为要求转换的是双向链表

pCurrent->m_pLeft = *pLastNodeInList;//根结点的左指针,指向左子树的最后一个节点*pLastNodeInList

if (*pLastNodeInList != nullptr)

(*pLastNodeInList)->m_pRight = pCurrent; //左子树的最后一个节点*pLastNodeInList的右指针,指向根结点

//3、递归转换右子树

*pLastNodeInList = pCurrent;

if (pCurrent->m_pRight != nullptr)//递归转换右子树

ConvertNode(pCurrent->m_pRight, pLastNodeInList);

}

//===================测试代码=========================

void PrintDoubleLinkedList(BinaryTreeNode*pHeadOfList)

{

BinaryTreeNode*pNode = pHeadOfList;

printf("The nodes from left to right are:n");

while (pNode != nullptr)

{

printf("%d t", pNode->m_nValue);

if (pNode->m_pRight == nullptr)

break;

pNode = pNode->m_pRight;

}

printf("The nodes from right to left are:n");

while (pNode != nullptr)

{

printf("%d t", pNode->m_nValue);

if (pNode->m_pLeft == nullptr)

break;

pNode = pNode->m_pLeft;

}

printf("n");

}

void DestroyList(BinaryTreeNode*pHeadOfList)

{

BinaryTreeNode*pNode = pHeadOfList;

while (pNode != nullptr)

{

BinaryTreeNode*pNext = pNode->m_pRight;

delete pNode;

pNode = pNext;

}

}

void Test(const char*testname,BinaryTreeNode*pRoot)

{

if (testname != nullptr)

printf("%s begins:n", testname);

PrintTree(pRoot);

BinaryTreeNode*pHeadOfList = Convert(pRoot);

PrintDoubleLinkedList(pHeadOfList);

}

// 10

// 6 14

//4 8 12 16

void Test01()

{

BinaryTreeNode*pNode10 = CreatNode(10);

BinaryTreeNode*pNode6 = CreatNode(6);

BinaryTreeNode*pNode14 = CreatNode(14);

BinaryTreeNode*pNode4 = CreatNode(4);

BinaryTreeNode*pNode8 = CreatNode(8);

BinaryTreeNode*pNode12 = CreatNode(12);

BinaryTreeNode*pNode16 = CreatNode(16);

BuildTree(pNode10, pNode6, pNode14);

BuildTree(pNode6, pNode4, pNode8);

BuildTree(pNode14, pNode12, pNode16);

Test("Test01", pNode10);

DestroyList(pNode10);

//DestroyTree(pNode10);

}

// 10

// 6

// 4

void Test02()

{

BinaryTreeNode*pNode10 = CreatNode(10);

BinaryTreeNode*pNode6 = CreatNode(6);

BinaryTreeNode*pNode4 = CreatNode(4);

BuildTree(pNode10, pNode6, nullptr);

BuildTree(pNode6, pNode4, nullptr);

Test("Test02", pNode10);

DestroyList(pNode10);

//DestroyTree(pNode10);

}

// 10

// 6

// 4

void Test03()

{

BinaryTreeNode*pNode10 = CreatNode(10);

BinaryTreeNode*pNode6 = CreatNode(6);

BinaryTreeNode*pNode4 = CreatNode(4);

BuildTree(pNode10, nullptr, pNode6);

BuildTree(pNode6, nullptr, pNode4);

Test("Test03", pNode10);

DestroyList(pNode10);

//DestroyTree(pNode10);

}

// 10

void Test04()

{

BinaryTreeNode*pNode10 = CreatNode(10);

BuildTree(pNode10, nullptr, nullptr);

Test("Test04", pNode10);

DestroyList(pNode10);

//DestroyTree(pNode10);

}

// nullptr

void Test05()

{

Test("Test05", nullptr);

}

int main()

{

//Test01();

//Test02();

//Test03();

Test04();

//Test05();

system("pause");

return 0;

}

//=========binarytree.h================

#pragma once

struct BinaryTreeNode

{

int m_nValue;

BinaryTreeNode* m_pLeft;

BinaryTreeNode* m_pRight;

};

BinaryTreeNode* CreatNode(int value);

void BuildTree(BinaryTreeNode*pRoot, BinaryTreeNode*pLeft, BinaryTreeNode*pRight);

void PrintTree(BinaryTreeNode*pRoot);

void DestroyTree(BinaryTreeNode*pRoot);

//==========binarytree.cpp===============

#include"binarytreen.h"

#include<iostream>

BinaryTreeNode* CreatNode(int value)

{

BinaryTreeNode*pNode = new BinaryTreeNode();

pNode->m_nValue = value;

pNode->m_pLeft = nullptr;

pNode->m_pRight = nullptr;

return pNode;

}

void BuildTree(BinaryTreeNode*pRoot, BinaryTreeNode*pLeft, BinaryTreeNode*pRight)

{

if (pRoot != nullptr)

{

pRoot->m_pLeft = pLeft;

pRoot->m_pRight = pRight;

}

}

void PrintTree(BinaryTreeNode*pRoot)

{

BinaryTreeNode*pNode = pRoot;

if (pNode == nullptr)

return;

else

printf("This node value is: %dn", pNode->m_nValue);

PrintTree(pNode->m_pLeft);

PrintTree(pNode->m_pRight);

}

void DestroyTree(BinaryTreeNode*pRoot)

{

if (pRoot == nullptr)

return;

if(pRoot->m_pLeft!=nullptr)

DestroyTree(pRoot->m_pLeft);

if(pRoot->m_pRight!=nullptr)

DestroyTree(pRoot->m_pRight);

delete pRoot;

pRoot = nullptr;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园的建设目标是通过数据整合、全面共享,实现校园内教学、科研、管理、服务流程的数字化、信息化、智能化和多媒体化,以提高资源利用率和管理效率,确保校园安全。 智慧校园的建设思路包括构建统一支撑平台、建立完善管理体系、大数据辅助决策和建设校园智慧环境。通过云架构的数据中心与智慧的学习、办公环境,实现日常教学活动、资源建设情况、学业水平情况的全面统计和分析,为决策提供辅助。此外,智慧校园还涵盖了多媒体教学、智慧录播、电子图书馆、VR教室等多种教学模式,以及校园网络、智慧班牌、校园广播等教务管理功能,旨在提升教学品质和管理水平。 智慧校园的详细方案设计进一步细化了教学、教务、安防和运维等多个方面的应用。例如,在智慧教学领域,通过多媒体教学、智慧录播、电子图书馆等技术,实现教学资源的共享和教学模式的创新。在智慧教务方面,校园网络、考场监控、智慧班牌等系统为校园管理提供了便捷和高效。智慧安防系统包括视频监控、一键报警、阳光厨房等,确保校园安全。智慧运维则通过综合管理平台、设备管理、能效管理和资产管理,实现校园设施的智能化管理。 智慧校园的优势和价值体现在个性化互动的智慧教学、协同高效的校园管理、无处不在的校园学习、全面感知的校园环境和轻松便捷的校园生活等方面。通过智慧校园的建设,可以促进教育资源的均衡化,提高教育质量和管理效率,同保障校园安全和提升师生的学习体验。 总之,智慧校园解决方案通过整合现代信息技术,如云计算、大数据、物联网和人工智能,为教育行业带来了革命性的变革。它不仅提高了教育的质量和效率,还为师生创造了一个更加安全、便捷和富有智慧的学习与生活环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值