结构体:
typedef struct 结构体名{
成员列表,即不同类型数据
} 别名;
别名= int = struct NAME
值调用:别名.成员变量名
. 与-> 的区别:结构体用. 结构体指针用 ->
结构体指针:
二叉树的三中遍历方法:
前序:根左右 中序:左根右 后序:左右根
练习
实现二叉树的三种遍历方式(递归建立)
// C、结构体 实现
# include <stdio.h>
# include <stdlib.h>
/*---1.指针、节点---*/
typedef struct treeNode
{
char data; //数据域
struct treeNode* LChild;
struct treeNode* RChild;
}TN;
/*---2.树结构---*/
struct treeNode* createNode(char data)
{
struct treeNode* newNode = (struct treeNode*)malloc(sizeof(struct treeNode)); //申请动态内存,C++中是new
newNode->data = data;
newNode->LChild = NULL;
newNode->RChild = NULL;
return newNode; //返回一个“树框架”
};
/*---3.连接节点---*/
void insertNode(struct treeNode* curNode, struct treeNode* LChildNode, struct treeNode* RChildNode)
{
curNode->LChild = LChildNode;
curNode->RChild = RChildNode;
}
/*---4.遍历---*/
//输出
void printData(TN* outNode){
printf("%c\t", outNode->data);
}
//中序
void minOder(TN* root){
if(root != NULL){
minOder(root->LChild);
printData(root);
minOder(root->RChild);
}
}
//前序
void preOder(TN* root){
if(root != NULL){
printData(root);
preOder(root->LChild);
preOder(root->RChild);
}
}
//中序
void lastOder(TN* root){
if(root != NULL){
lastOder(root->LChild);
lastOder(root->RChild);
printData(root);
}
}
int main(){
/*---实现一棵树---*/
//定义节点
TN* A = createNode('1');
TN* B = createNode('2');
TN* C = createNode('3');
TN* D = createNode('4');
TN* E = createNode('5');
TN* F = createNode('6');
TN* G = createNode('7');
TN* H = createNode('8');
//printf("%c\t%c\t", A->data,B->data);
//连接节点
insertNode(A,B,C);
insertNode(B,D,E);
insertNode(C,F,G);
insertNode(D,H,NULL);
/*-----输出-----*/
//打印指针所指向的节点的数据域的值
minOder(A);
printf("\n");
preOder(A);
printf("\n");
lastOder(A);
printf("\n");
return 0;
}
//C++、函数 实现
#include<iostream>
using namespace std;
typedef char ElemType; //数据类型
typedef struct BiTreeNode//定义结构体
{
ElemType data; //数据域
struct BiTreeNode *lChild;//左孩子
struct BiTreeNode *rChlid;//右孩子
} BiTreeNode, *BiTree;
//先序创建二叉树
void CreateBiTree(BiTree &T)//要改变指针,C++可以把指针的引用传进来
{
ElemType ch;
while(cin >> ch){ //新的一行ctrl+d结束输入
if (ch == '#')
T = NULL;
else
{
T = new BiTreeNode;
T->data = ch;
CreateBiTree(T->lChild);//cout<<"输入"<<ch<<"的左孩子:" ;
CreateBiTree(T->rChlid);//cout<<"输入"<<ch<<"的右孩子:" ;
}
}
}
//先序遍历二叉树
void TraverseBiTree(BiTree T)
{
if (T == NULL)
return ;
cout << T->data <<" ";
TraverseBiTree(T->lChild);
TraverseBiTree(T->rChlid);
}
//中序遍历二叉树
void InOrderBiTree(BiTree T)
{
if (T == NULL)
return ;
InOrderBiTree(T->lChild);
cout << T->data <<" ";
InOrderBiTree(T->rChlid);
}
//后序遍历二叉树
void PostOrderBiTree(BiTree T)
{
if (T == NULL)
return ;
PostOrderBiTree(T->lChild);
PostOrderBiTree(T->rChlid);
cout << T->data <<" ";
}
int main(void)
{
BiTree T;
cout << "请输入先序遍历顺序下各个结点的值,#表示没有结点:" << endl;
CreateBiTree(T);
cout<<"先序遍历二叉树:"<<endl;
TraverseBiTree(T);
cout<<endl;
cout<<"中序遍历二叉树:"<<endl;
InOrderBiTree(T);
cout<<endl;
cout<<"后序遍历二叉树:"<<endl;
PostOrderBiTree(T);
cout<<endl;
return 0;
}