二叉树的实现

自己实现了二叉树的结构及一些常规操作
贴在这里以便保存。

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;
	}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值