博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第一题
阅读量:7078 次
发布时间:2019-06-28

本文共 1902 字,大约阅读时间需要 6 分钟。

1.把二元查找树转变成排序的双向链表(树)
 题目:

输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。

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

   10

  / /

  6  14

 / / / /

4  8 12 16

 转换成双向链表

4=6=8=10=12=14=16。
 
我的解答:
#
include 
<iostream
>
#
include 
<string
>
#
include 
<vector
>
#
include 
<bitset
>
#
include 
<string
>
#
include 
<sstream
>
using 
namespace std;
struct BSTreeNode{
    
int m_nValue; 
// value of node 
    BSTreeNode 
*m_pLeft; 
// left child of node 
    BSTreeNode 
*m_pRight; 
// right child of node 
};
void addBSTreeNode(BSTreeNode 
*
&T,
int node){
//注意:由于要给T这个指针赋值(T = new BSTreeNode()),故此处必须用引用!
    
if(T){
        
if(T
-
>m_nValue 
> node){ 
//添加到左子树
            addBSTreeNode(T
-
>m_pLeft, node);
        }
else 
if(T
-
>m_nValue 
< node){
//添加到右子树
            addBSTreeNode(T
-
>m_pRight, node);
        }
else{
            cout
<<
"加入重复节点"
<<endl;
        }
    }
else{
        T 
= 
new BSTreeNode();
//添加节点
        T
-
>m_nValue 
= node;
        T
-
>m_pLeft 
= NULL;
        T
-
>m_pRight 
= NULL;
    }
}
BSTreeNode 
*lastNode 
= NULL;
//储存链表中的上一个节点
BSTreeNode 
*startNode 
= NULL;
//存双向链表的头节点
void midOrderTraverse(BSTreeNode 
*T){
    
if(T){
        midOrderTraverse(T
-
>m_pLeft);
//访问左子树
        T
-
>m_pLeft
=lastNode;
//当前节点的m_pLeft指向上一节点
        
if(lastNode){
            lastNode
-
>m_pRight 
= T;
//上一个节点的m_pRight指向当前节点
        }
else{
            startNode 
= T;
//上一个节点为空,则该节点为头结点
        }
        lastNode 
= T;
//当前节点变为上一节点
        midOrderTraverse(T
-
>m_pRight);
//访问右子树
    }
}
int main(){
    BSTreeNode 
*pRoot
=NULL;
    
//初始化二叉搜索树
    addBSTreeNode(pRoot, 
10);
    addBSTreeNode(pRoot, 
4);
    addBSTreeNode(pRoot, 
6);
    addBSTreeNode(pRoot, 
8);
    addBSTreeNode(pRoot, 
12);
    addBSTreeNode(pRoot, 
14);
    addBSTreeNode(pRoot, 
15);
    addBSTreeNode(pRoot, 
16);
    
//中序遍历变为双向链表
    midOrderTraverse(pRoot);
    
//打印输出
    
while(startNode){
        cout
<<startNode
-
>m_nValue
<<endl;
        startNode 
= startNode
-
>m_pRight;
    }
    
return 
0;
}
 
心得:
1、注意形参中引用的作用,如在addBSTreeNode函数中行参T加上&,才能是给T赋值有效!
2、二叉树的遍历:采用递归,流程如下
Traverse(BiTree 
*T){
   
if(T){
//T不为空
        PreOrderVisitDate(T
-
>Data)
//先序遍历
        Traverse(T
-
>leftChild)
//访问左子树
        MidOrderVisitDate(T
-
>Data)
//中序遍历
        Traverse(T
-
>rightChild)
//访问右子树
        postOrdrtVisitDate(T
-
>Data)
//后序遍历
    }
}
 
 

 

转载地址:http://bpdml.baihongyu.com/

你可能感兴趣的文章
大型网站架构系列:缓存在分布式系统中的应用(二)
查看>>
Hdu 2018 母牛的故事
查看>>
C language 模拟 win的经典游戏——扫雷
查看>>
Codeforces Round #297 (Div. 2) 525D Arthur and Walls(dfs)
查看>>
Intent启动系统组件(activity,service,BroadReceiver)-android学习之旅(四十九)
查看>>
MVC-MODEL
查看>>
shiro-5基于url的权限管理
查看>>
MyMVC配置
查看>>
读懂JVM垃圾收集日志
查看>>
CentOS 开机启动
查看>>
ASP.NET Core的身份认证框架IdentityServer4(5)- 包和构建
查看>>
查看本机的ip地址
查看>>
select点击option获取文本输入框的焦点事件
查看>>
setup 命令中防火墙配置选项无法打开
查看>>
kaptcha验证码
查看>>
Centos6下编译LEDE/OpenWrt
查看>>
kubernetes入门(08)kubernetes单机版的安装和使用
查看>>
SonarQube代码质量管理平台 的安装、配置与使用
查看>>
docker~run起来之后执行多条命令
查看>>
Linux下通过受限bash创建指定权限的账号
查看>>