二叉树构建、计算、遍历源码c++

descpription

  • 下面代码给出二叉树的构建、计算节点总数、叶子节点总数、深度、前序、中序、后序遍历、销毁的完整代码,在codeblocks上测试过可以直接运行。
#include <iostream>
#include <stdlib.h>

using namespace std;

typedef struct TreeNode{
    int data;
    TreeNode* left;
    TreeNode* right;
}Node;

//创建二叉树,按照根、左、右的顺序赋值
Node* createTree()
{
    Node* p = NULL;
    int value;
    cin>>value;
    if(value == 0){
        p = NULL;
    }else{
        p = (Node*)malloc(sizeof(Node));
        p->data = value;
        p->left = createTree();
        p->right = createTree();
    }

    return p;
}

//计算节点个数
int numberOfNodes(Node* root)
{
    if(NULL == root){
        return 0;
    }
    return 1+numberOfNodes(root->left)+numberOfNodes(root->right);
}

//叶子节点个数
int numberOfLeafNodes(Node* root)
{
    if(NULL == root){
        return 0;
    }
    if(root->left == NULL && root->right == NULL){
        return 1;
    }
    return numberOfLeafNodes(root->left)+numberOfLeafNodes(root->right);
}

//计算深度,分别求出左子树的深度、右子树的深度,两个深度的较大值+1
int depthTree(Node* root)
{
    if(NULL == root){
        return 0;
    }
    int left_depth = depthTree(root->left);
    int right_depth = depthTree(root->right);
    return left_depth>right_depth?left_depth+1:right_depth+1;
}

//前序遍历
void preOrderTravel(Node* root)
{
    if(NULL == root){
        return;
    }
    cout<<root->data<<" ";
    preOrderTravel(root->left);
    preOrderTravel(root->right);
}

//中序遍历
void midOrderTravel(Node* root)
{
    if(NULL == root){
        return;
    }
    midOrderTravel(root->left);
    cout<<root->data<<" ";
    midOrderTravel(root->right);
}

//后序遍历
void lastOrderTravel(Node* root)
{
    if(NULL == root){
        return;
    }
    lastOrderTravel(root->left);
    lastOrderTravel(root->right);
    cout<<root->data<<" ";
}

//删除二叉树,释放空间
void deleteTree(Node* root)
{
    if(NULL == root){
        return;
    }
    deleteTree(root->left);
    deleteTree(root->right);
    free(root);
    root = NULL;
}

int main()
{
    cout<<"create binary tree."<<endl;
    Node* root = NULL;
    root = createTree();

    cout<<"number of nodes:";
    cout<<numberOfNodes(root);
    cout<<endl;

    cout<<"numberOfLeafNodes:";
    cout<<numberOfLeafNodes(root);
    cout<<endl;

    cout<<"depthTree:";
    cout<<depthTree(root);
    cout<<endl;

    cout<<"preOrderTravel:";
    preOrderTravel(root);
    cout<<endl;

    cout<<"midOrderTravel:";
    midOrderTravel(root);
    cout<<endl;

    cout<<"lastOrderTravel:";
    lastOrderTravel(root);
    cout<<endl;

    deleteTree(root);
    return 0;
}

运行输入:
1 2 4 8 0 0 9 0 0 5 0 0 3 6 0 0 7 0 0
构建的二叉树如下:

在这里插入图片描述
输出结果如下:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值