二叉树c++实现(代码向)

二叉树是一种数据结构,它由一个根节点和两个子树组成,分别称为左子树和右子树。每个子树也是一个二叉树,因此二叉树是一种递归定义的结构。

为了实现二叉树,我们需要定义一个结点类型,它包含一个数据域和两个指针域,分别指向左子树和右子树。

二叉树具有以下五种基本形态:

(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++实现,主要利用的知识就是递归和链表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值