二叉树基本操作c++

1.二叉树结构体定义

struct TreeNode {
      int val;
      TreeNode *left;
      TreeNode *right;
      TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 };

2.递归创建二叉树

TreeNode *CreateBinaryTree()//创建二叉树
{
    TreeNode *p;
    Datetype num;
    cin>>num;
    if(num == 0)
    {
        p = NULL;
    }
    else{
        p = new TreeNode(num);
        p->left = CreateBinaryTree();
        p->right = CreateBinaryTree();
    }

}

3.前序遍历

void preOrderTraverse(TreeNode *root)
{
    if(root)
    {
        cout<<root->val<<" ";
        preOrderTraverse(root->left);
        preOrderTraverse(root->right);
    }
}

4.中序遍历

void inOrderTraverse(TreeNode *root)
    if(root)
    {
        inOrderTraverse(root->left);
        cout<<root->val<<" ";
        inOrderTraverse(root->right);
    }
}

5.后序遍历

void lastOrderTraverse(TreeNode *root)//后序遍历
{
    if(root)
    {
        lastOrderTraverse(root->left);
        lastOrderTraverse(root->right);
        cout<<root->val<<" ";
    }
}

6. 二叉树最大深度

int maxDepth(TreeNode* root) 
{
        if(root==NULL) return 0;
        int left = maxDepth(root->left);
        int right = maxDepth(root->right);
        return left>right?left+1:right+1;
}

7. 二叉树总节点数

int Nodenum(TreeNode* root)//二叉树总节点数
{
  if(root==NULL)
     return 0;
 else
    return Nodenum(root->left)+Nodenum(root->right)+1;
}

8.二叉树叶子节点数

int Leafnum(TreeNode* root)//二叉树叶子节点数
{
   if(root==NULL)
    return 0;
   else  if(root->left==NULL&&root->right==NULL)
    return 1;
   else
    return Leafnum(root->left)+Leafnum(root->right);
}

9.总程序

#include<iostream>
using namespace std;
typedef int  Datetype;

struct TreeNode {
      int val;
      TreeNode *left;
      TreeNode *right;
      TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 };
 //定义二叉树结构体

TreeNode *CreateBinaryTree()//创建二叉树
{
    TreeNode *p;
    Datetype num;
    cin>>num;
    if(num == 0)
    {
        p = NULL;
    }
    else{
        p = new TreeNode(num);
        p->left = CreateBinaryTree();
        p->right = CreateBinaryTree();
    }

}
void preOrderTraverse(TreeNode *root)//前序遍历
{
    if(root)
    {
        cout<<root->val<<" ";
        preOrderTraverse(root->left);
        preOrderTraverse(root->right);
    }
}

void inOrderTraverse(TreeNode *root)//中序遍历
{
    if(root)
    {
        inOrderTraverse(root->left);
        cout<<root->val<<" ";
        inOrderTraverse(root->right);
    }
}

void lastOrderTraverse(TreeNode *root)//后序遍历
{
    if(root)
    {
        lastOrderTraverse(root->left);
        lastOrderTraverse(root->right);
        cout<<root->val<<" ";
    }
}

int maxDepth(TreeNode* root) //二叉树最大深度
{
        if(root==NULL) return 0;
        int left = maxDepth(root->left);
        int right = maxDepth(root->right);
        return left>right?left+1:right+1;
}

int Nodenum(TreeNode* root)//二叉树总节点数
{
  if(root==NULL)
     return 0;
 else
    return Nodenum(root->left)+Nodenum(root->right)+1;
}

int Leafnum(TreeNode* root)//二叉树叶子节点数
{
   if(root==NULL)
    return 0;
   else  if(root->left==NULL&&root->right==NULL)
    return 1;
   else
    return Leafnum(root->left)+Leafnum(root->right);
}
int main()
{
    TreeNode *root  = NULL;
    root = CreateBinaryTree();
    cout<<"Binary tree created successfully!"<<endl;
    cout<<"前序遍历结果:"<<endl;
    preOrderTraverse(root);
    cout<<endl<<"中序遍历结果:"<<endl;
    inOrderTraverse(root);
    cout<<endl<<"后序遍历结果:"<<endl;
    lastOrderTraverse(root);
    cout<<endl<<"二叉树最大深度为:"<<maxDepth(root)<<endl;
    cout<<"二叉树叶子节点数为:"<<Leafnum(root)<<endl;
    cout<<"二叉树总节点数为:"<<Nodenum(root)<<endl;
}

10.测试

测试用例如下图:

则输入 1 2 4 8 0 0 9 0 0 5 10 0 0 0 3 6 0 0 7 0 0

输出结果:

猜你喜欢

转载自blog.csdn.net/jd_457619512/article/details/84729285