二叉树是一种数据结构,它由一个根节点和两个子树组成,分别称为左子树和右子树。每个子树也是一个二叉树,因此二叉树是一种递归定义的结构。
为了实现二叉树,我们需要定义一个结点类型,它包含一个数据域和两个指针域,分别指向左子树和右子树。
二叉树具有以下五种基本形态:
(l)空二叉树
(2)只有1个根结点
(3)根结点只有左子树
(4)根结点只有右子树
(5)根结点既有左子树又有右子树
一般来说,二叉树的常用操作有:
1.确定高度
2.确定元素数目
3.复制
4.显示或打印二叉树
5.删除二叉树
6.遍历二叉树
二叉树主要借助链表实现,这里是它的结构
#include <iostream>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>
#include <algorithm>
using namespace std;
typedef int BtdataType;
Typedef struct BtNode{
BtdataType data;
struct BTNode* left;
struct BTNode* right;
}BTNode;
然后是二叉树的遍历,二叉树有四种遍历方式,分别为前序遍历,中序遍历,后序遍历,层序遍历。这里我们给出前三种。
这里我们实现一下它的前序遍历,前序遍历的顺序就是,先遍历根,然后左子树,然后遍历右子树。简单记,根左右。
int prevorder(BTNode* root)
{
if(root==NULL)
{
cout<<"NULL";
}
cout<<root->left;
prevorder(root->left);
prevorder(root->right);
}
然后是中序遍历,中序遍历的顺序为,先遍历左子树,然后遍历根,最后遍历右子树。简单记为左根右。
int middleorder(BTNode* root)
{
if(root==NULL)
{
cout<<"NULL";
}
middleorder(root->left);
cout<<root->data;
middleorder(root->right);
}
后序遍历,就是先遍历左子树,然后遍历右子树,最后遍历根。简单记为左右根。
int afterorder(BTNode* root)
{
if(root==NULL)
{
cout<<"NULL";
}
afterorder(root->left);
afterorder(root->right);
cout<<root->data;
}
关于如何求出二叉树的节点数目,这个并不难,如果节点不为空就返回左子树加右子树的节点再加自己。代码如下:
int BinaryTreeSize(BtNode* root){
if(root!=NULL){
return BinaryTreeSize(root->left)+BinaryTreeSize(root->right)+1;
}else return 0;
}
然后是如何求树的高度
对于树的高度,一般我们看他左右子树最长的那个,再加上根的本身,就是它的最大高度。我们这里用两个值去记录左右子树的高度。
int BinaryTreeHeight(BTNode* root){
if(root!=NuLL){
int left=BinaryTreeHeight(root->left);
int right=BinaryTreeHeight(root->right);
return max(left+1,right+1);
}else return 0;
}
如何求出节点数目
关于如何求出节点数,在第一层的角度看第三层,那么它是第三层,在第二层的角度看它是第二层,第三层的角度看第一层,它是第一层,那么也就是说取决于你的观看位置,对吧,也就满足节点数的左子树的N-1层的节点+右子树的N-1层节点,当N=1时返回1。
int BinaryTreenode(BTNode* root,int N){
if(root!=NULL){
return BinaryTreenode(root->left,N-1)+BinaryTreenode(root->right,N-1);
}else if(N==1) return 1;
else return 0;
}
关于二叉树的查找
查找值为x的点,我们需要考虑一些问题,如果我们找到这个值能否直接返回?如果我们找不到的时候要返回空指针,节点为空的时候也要返回空指针,就是递归中要保证有返回值。
BTNode* BinaryTree(BTNode* root,BTDataType x){
if(root==NULL){
return NULL;
}
if(root->data==x){
return root;
}
BTNode* left=BinaryTree(root->left,x);
if(left) return left;
BTNode* right=BinaryTree(root->right,x);
if(right) return right;
return NULL;
}
以上为二叉树的c++实现,主要利用的知识就是递归和链表。