自己实现了二叉树的结构及一些常规操作
贴在这里以便保存。
1、先序遍历
2、中序遍历
3、后序遍历
4、创建二叉树
5、复制二叉树
6、查找给定结点的父亲
7、查找结点
8、删除二叉树
9、插入结点
10、树root中删除结点t及其子树
11、非递归中序遍历算法
下面贴出代码:
1.h
#pragma once
#include<iostream>
#include<string>
#include<vector>
using namespace std;
typedef char EleementType;
typedef struct BinTreeNode* BinTree;
struct BinTreeNode
{
char Data;
BinTreeNode* left;
BinTreeNode* right;
};
function.h
#pragma once
#include "1.h"
void PreOrder(BinTree t);//先序遍历
void InOrder(BinTree t);//中序遍历
void PostOrder(BinTree t);//后序遍历
BinTree Create();//创建二叉树
BinTree CopyTree(BinTree t);//复制二叉树
BinTree Father(BinTree t, BinTree p);//查找给定结点的父亲
BinTree Find(BinTree t, char item);//查找结点
void Del(BinTree p);//删除二叉树
void Insert(BinTree s, char item, int flag);//插入结点
void DelSonTree(BinTree root, BinTree t);//树root中删除结点t及其子树
void NorecInOrder(BinTree t);//非递归中序遍历算法
pre_in_postorder.cpp
#include"1.h"
void PreOrder(BinTree t)
{
if (t != NULL)
{
cout << t->Data;
PreOrder(t->left);
PreOrder(t->right);
}
}
void InOrder(BinTree t)
{
if (t != NULL)
{
InOrder(t->left);
cout << t->Data;
InOrder(t->right);
}
}
void PostOrder(BinTree t)
{
if (t != NULL)
{
PostOrder(t->left);
PostOrder(t->right);
cout << t->Data;
}
}
Create.cpp
#include"1.h"
BinTree Create()
{
BinTree t;
char ch;
cin >> ch; //顺序读入序列中的一个符号
if (ch == '#')
{
t = NULL;
return t;
}
else
{
t = (BinTree)malloc(sizeof(struct BinTreeNode));
t->Data = ch;
t->left = Create();
t->right = Create();
return t;
}
}
CopyTree.cpp
#include"1.h"
BinTree CopyTree(BinTree t)
{
BinTree p,p1,p2;
if (t == NULL) {
p = NULL;
return p;
}
if (t->left != NULL) {
p1 = CopyTree(t->left);
}
else {
p1 = NULL;
}
if (t->right != NULL) {
p2 = CopyTree(t->right);
}
else {
p2 = NULL;
}
p = (BinTree)malloc(sizeof(struct BinTreeNode));
p->Data = t->Data;
p->left = p1;
p->right = p2;
return p;
}
Father.cpp
#include"1.h"
//找到树t中的结点p的父结点
BinTree Father(BinTree t, BinTree p)
{
BinTree father,q;
if (t == NULL || p == NULL || t==p) {
father = NULL;
return father;
}
//t为所求?
if (t->left == p || t->right == p) {
father = t;
return father;
}
//递归
father=Father(t->left, p);
if (father != NULL) {
return father;
}
father = Father(t->right, p);
return father;
}
Find.cpp
#include"1.h"
BinTree Find(BinTree t, char item)
{
BinTree q=NULL;
if (t == NULL) {
return q;
}
if (t->Data == item) {
q = t;
return q;
}
q=Find(t->left, item);
if (q != NULL) {
return q;
}
q = Find(t->right, item);
return q;
}
Del.cpp
#include"1.h"
void Del(BinTree p)
{
if (p == NULL) {
return;
}
Del(p->left);
Del(p->right);
free(p);
}
Insert.cpp
#include"1.h"
//在二叉树中插入Data为item的结点p,flag为1时p为s的左节点,flag为2时p为s的右节点
void Insert(BinTree s,char item, int flag)
{
if ( s == NULL) {
return;
}
BinTree p;
p = (BinTree)malloc(sizeof(struct BinTreeNode));
p->Data = item;
if (flag == 1) {
p->left = s->left;
s->left = p;
}
else if (flag == 2)
{
p->left = s->right;
s->right = p;
}
else {
free(p);
cout << "flag值错误" << endl;
}
}
DelSonTree.cpp
#include"1.h"
#include"function.h"
//树root中删除结点t及其子树
void DelSonTree(BinTree root, BinTree t)
{
if (t == NULL) {
return;
}
if (t == root) {
Del(t);
root = NULL;
}
//找到t的父亲
BinTree p = t;
BinTree q;
q = Father(root, p);
if (q->left == p) {
q->left = NULL;
}
else if (q->right == p) {
q->right = NULL;
}
Del(p);
}
nio.cpp
#include"1.h"
#include<vector>
//非递归中序遍历算法
void NorecInOrder(BinTree t)
{
vector<BinTree> s = vector<BinTree>();//初始化空向量
BinTree p = t;
while (1)
{
while (p != NULL) {
s.push_back(p);
p = p->left;
}
if (s.empty()) {
return;
}
else {
int i = s.size();
p = s[i-1];
s.pop_back();
}
cout << p->Data;
p = p->right;
}
}