几乎每一位码士的编程起点都是C,在玩过了Java、C#、PHP、Python之后,重回C语言,又是什么样的一种感觉呢?
此篇博文作为 【C语言强化】系列文章的第一篇,来聊聊曾让许多码士抓耳挠腮的二叉树。
通过这道题,你可以掌握
- 如何创建二叉树
- 如何遍历二叉树
- 如何创建二叉链表
- 怎样使用递归算法
这是一道非常老土但又十分经典的数据结构题,或许很多人会说自己之前已经做过了,但又有多少人回过头来做的时候,可以不借助任何参考资料把解题思路写出来?
题目要求:二叉排序树->双向链表排序
不能新增结点,只能修改指针指向
思路
1.定义二叉树结构体
2.二叉树构造函数,作用:指定要插入的值和二叉树的根结点,可以自动插入到二叉排序树
3.中序遍历二叉树的同时向双向链表插入结点并打印
源代码
#include <stdio.h>
#include<stdlib.h>
#include <iostream>
using namespace std;
/**
二叉排序树->双向链表排序
不能新增结点,只能修改指针指向
思路
1.创建二叉树结构体
2.二叉树构造函数
3.中序遍历二叉树的同时向双向链表插入结点并打印
*/
//创建二叉树结构体
struct BTreeNode{
int value;
BTreeNode *leftNode;
BTreeNode *rightNode;
};
typedef BTreeNode Btn;
BTreeNode *dListIndex;//双向链表的索引,指向当前链表的尾巴
BTreeNode *dListHead;//双向链表的头
/*
二叉树构造函数
按照二叉排序的算法插入(左小右大)
node 二叉树的根结点
value 要插入的结点的值
*/
void insertToBTree(BTreeNode * &node,int value){
//结点为空,插入结点为根结点
if(NULL==node){
BTreeNode * btNode=new BTreeNode();
btNode->value=value;
btNode->leftNode=NULL;
btNode->leftNode=NULL;
node=btNode;
}else{//结点非空
//值小于根结点,递归左结点
if((node->value)>value)
insertToBTree(node->leftNode,value);
//值大于根结点,递归右结点
else if(value>(node->value))
insertToBTree(node->rightNode,value);
//值与已有结点值相等,提示错误
else
printf("结点已经存在,不可以再次插入!");
}
}
/*
双向链表构造函数
btNode 要插入的结点
*/
void insertToDoubleList(Btn * btNode){
//要插入的结点的左指针指向双向链表尾巴
btNode->leftNode=dListIndex;
//如果双向链表非空,双向链表尾巴右边指向要插入的结点,完成双向链接
if(NULL!=dListIndex)
dListIndex->rightNode=btNode;
//双向链表为空,头结点为要插入结点
else
dListHead=btNode;
//索引结点永远指向插入的结点
dListIndex=btNode;
//输出值
cout<<btNode->value<<endl;
}
/*中序遍历二叉排序树,同时往双向链表插入值
btNode 二叉树根结点
*/
void goThroughBTree(Btn * btNode){
//结点为空,返回
if(NULL==btNode)
return;
//左结点不为空,继续向左深入
else if(NULL!=btNode->leftNode)
goThroughBTree(btNode->leftNode);
//直到左结点为空,插入
insertToDoubleList(btNode);
//右不为空,向右深入
if(NULL!=btNode->rightNode){
goThroughBTree(btNode->rightNode);
}
}
void main()
{
BTreeNode *root=NULL;//二叉树根结点
dListIndex=NULL;
dListHead=NULL;
//创建二叉排序树
insertToBTree(root,10);
insertToBTree(root,6);
insertToBTree(root,12);
insertToBTree(root,14);
insertToBTree(root,8);
insertToBTree(root,4);
insertToBTree(root,16);
//遍历二叉树
goThroughBTree(root);
system("pause");
}
这道题十分基础,基础到几乎每个程序员都见过,但有多少人能够真的理解二叉树的概念而不借助任何参考把它做出来呢?这也是它会是微软的面试题的原因。