003 二叉树

一、构造二叉树
#include<vector>
#include<iostream>
using namespace std;

class SerchTree
{
private:
	TreeNode* root;
public:
	SerchTree();

	//插入节点
	void Insert_Node(TreeNode* root, int val)
	{
		if (NULL == root)
			root = new TreeNode(val);
		else
		{
			if (val < root->val)
				Insert_Node(root->left, val);
			else 
			{
				//一样大就往左走吧
				Insert_Node(root->right, val);
			}
		}
	}

	//从数组中构造二叉搜索树
	void Create_SerchTree(vector<int>& vec)
	{
		int sz = vec.size();
		for (int i = 0; i < sz; i++)
		{
			Insert_Node(root, vec[i]);
		}
	}

	//搜索某个节点是否存在
	bool SerchNode(TreeNode* root, int val)
	{
		if (NULL == root)
			return false;
		if (val < root->val)
			return SerchNode(root->left, val);
		else if (val > root->val)
			return SerchNode(root->right,val);
		else
			return true;
	}

	//删除节点
	void DelNode(TreeNode* node)
	{
		TreeNode* temp;
		if (NULL == node->right)
		{
			//如果右子节点为空
			temp = node;
			node = node->left;
			delete temp;
		}
		else
		{
			//如果右子节点不空
			temp = node;
			while (NULL != temp->left)
			{
				temp = temp->left;
			}
			node->val = temp->val;
			delete temp;
		}
	}

	//删除某个节点
	void DelSerchNode(TreeNode* root, int val)
	{
		if (NULL == root)
			return;
		if (val < root->val)
			return DelSerchNode(root->left, val);
		else if (val > root->val)
			return DelSerchNode(root->right);
		else
			DelNode(root);
	}

	//计算二叉树的最大深度
	int maxDepth(Node x)
	{
		//1.如果根节点为空,最大深度为0;
		if (x == NULL)
			return 0;

		int max = 0;
		int maxL = 0;
		int maxR = 0;

		//2.计算左子树的最大深度
		if (x.left != NULL)
			maxL = maxDepth(x.left);

		//3.计算右子树的最大深度;
		if (x.right != NULL)
			maxR = maxDepth(x.right);

		//4.当前树的最大深度=左子树的最大深度和右子树的最大深度中的较大者+1
		max = maxL > maxR ? maxL + 1 : maxR + 1;
		return max;
	}
}

二、遍历二叉树
#include<stdio.h>
#include<malloc.h>

struct BTNode
{
	int data;	//数据域
	struct BTNode* pLchild;//左子树指针域,L是左,child是孩子,左子树
	struct BTNode* pRchild;//右子树指针域,R是左,child是孩子,右子树
};

void PreTraverseBTree(struct BTNode* pT);//先序遍历二叉树
void InTraverseBTree(struct BTNode* pT);//中序遍历二叉树
void PostTraverseBTree(struct BTNode* pT);//后序遍历二叉树
struct BTNode* CreateBTree(void);//创建二叉树

int main(void)
{
	struct BTNode* pT = CreateBTree();
	printf("先序遍历:\n");
	PreTraverseBTree(pT);
	printf("中序遍历:\n");
	InTraverseBTree(pT);
	printf("后序遍历:\n");
	PostTraverseBTree(pT);
	
	return 0;
}

struct BTNode* CreateBTree(void)//创建二叉树,并返回顶层根节点的地址
{
	struct BTNode* pA = (struct BTNode*)malloc(sizeof(struct BTNode));//创建A节点
	struct BTNode* pB = (struct BTNode*)malloc(sizeof(struct BTNode));//创建B节点
	struct BTNode* pC = (struct BTNode*)malloc(sizeof(struct BTNode));//创建C节点
	struct BTNode* pD = (struct BTNode*)malloc(sizeof(struct BTNode));//创建D节点
	struct BTNode* pE = (struct BTNode*)malloc(sizeof(struct BTNode));//创建E节点

	pA->data = 'A';//A节点数据域内的数据
	pB->data = 'B';//B节点数据域内的数据
	pC->data = 'C';//C节点数据域内的数据
	pD->data = 'D';//D节点数据域内的数据
	pE->data = 'E';//E节点数据域内的数据

	pA->pLchild = pB;//根据二叉树知道A节点左子树指针域指向B节点
	pA->pRchild = pC;//根据二叉树知道A节点右子树指针域指向C节点
	pB->pLchild = pB->pRchild = NULL;//根据二叉树知道B节点左、右子树的指针域为空NULL
	pC->pLchild = pD;//根据二叉树知道C节点左子树指针域指向D
	pC->pRchild = NULL;//根据二叉树知道C节点右子树指针域指向D
	pD->pLchild = NULL;//根据二叉树知道D节点左子树指针域为空NULL
	pD->pRchild = pE;//根据二叉树知道D节点右子树指针域指向E节点
	pE->pLchild = pE->pRchild = NULL;//根据二叉树知道E节点左、右子树指针域为空NULL

	return pA;//返回顶层根节点A的地址
}


//先序遍历
void PreTraverseBTree(struct BTNode* pT)
{
	if (pT != NULL)//根节点A的地址不为空,二叉树创建成功
	{
		printf("%c\n", pT->data);//先序遍历根节点
		if (NULL != pT->pLchild)//根节点左子树指针域不为空NULL
		{
			PreTraverseBTree(pT->pLchild);//先序遍历左子树
		}
		if (NULL != pT->pRchild)//根节点右子树指针域不为空NULL
		{
			PreTraverseBTree(pT->pRchild);//先序遍历右子树
		}
		//pT->pLchild可以代替整个左子树
	}
}

//中序遍历
void InTraverseBTree(struct BTNode* pT)
{
	if (pT != NULL)//根节点的地址不为空,二叉树创建成功
	{
		if (NULL != pT->pLchild)
		{
			InTraverseBTree(pT->pLchild);//中序遍历左子树
		}
		printf("%c\n", pT->data);//中序遍历根节点
		if (NULL != pT->pRchild)
		{
			InTraverseBTree(pT->pRchild);//中序遍历右子树
		}
		//pT->pLchild代表整个左子树
	}
}

//后序遍历
void PostTraverseBTree(struct BTNode* pT)
{
	if (pT != NULL)
	{
		if (NULL != pT->pLchild)
		{
			PostTraverseBTree(pT->pLchild);//后序遍历左子树
		}
		if (NULL != pT->pRchild)
		{
			PostTraverseBTree(pT->pRchild);//后序遍历右子树
		}
		printf("%c\n", pT->data);//后序遍历根节点
		//pT->pLchild 可以代表整个左子树
	}
}

结果

先序遍历:
A
B
C
D
E
中序遍历:
B
A
D
E
C
后序遍历:
B
E
D
C
A
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2021 Nqq

你的鼓励是我学习的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值