Cpp 二叉树

#include<vector>
#include<iostream>
using namespace std;

//二叉树的一个节点结构
struct BinaryTreeNode {
    int val;
    BinaryTreeNode *left;
    BinaryTreeNode *right;
    BinaryTreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

//使用递归的方法创建二叉树
struct BinaryTreeNode *CreatBinaryTree(){
    int a;
    cin >> a; //有多少叶子就需要输入2倍个 0 才能结束创建进程
    if(a == 0) return NULL;

    struct BinaryTreeNode *newnode = (struct BinaryTreeNode*)malloc( sizeof(struct BinaryTreeNode) );
    newnode->val = a;
    newnode->left  = CreatBinaryTree();  //递归创建左子树
    newnode->right = CreatBinaryTree();  //递归创建右子树
    return newnode;
}

//先序遍历
void PreOrderTraverse(struct BinaryTreeNode *root){
    if(root){
        cout << root->val << ' ';
        PreOrderTraverse(root->left);
        PreOrderTraverse(root->right);
    }
}

//中序遍历
void InOrderTraverse(struct BinaryTreeNode *root){
    if(root){
        InOrderTraverse(root->left);
        cout << root->val << ' ';
        InOrderTraverse(root->right);
    }
}

//后序遍历
void LastOrderTraverse(struct BinaryTreeNode *root){
    if(root){
        LastOrderTraverse(root->left);
        LastOrderTraverse(root->right);
        cout << root->val << ' ';
    }
}

//二叉树节点总数目
int NodeNum(struct BinaryTreeNode *root){

    if(root)
        return 1+NodeNum(root->left)+NodeNum(root->right);
    else
        return 0;
}

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

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

//二叉树最小深度(从根节点到最近叶子节点,注意是叶子)
int minDepth(struct BinaryTreeNode *root){
    if(root == NULL) return 0;
    if(root->left == NULL) return minDepth(root->right) + 1;
    if(root->right == NULL) return minDepth(root->left) + 1;
    return min(minDepth(root->left), minDepth(root->right)) + 1;
}

//二叉树所用路径
void dfspath(BinaryTreeNode* node,string path,vector<string> &result){
    path += to_string(node->val);
    //遍历到子节点了,
    if(node->left==NULL && node->right==NULL) result.push_back(path);
    if(node->left!=NULL) dfspath(node->left, path + "->",result);
    if(node->right!=NULL) dfspath(node->right,path + "->",result);
}
vector<string> binaryTreePaths(BinaryTreeNode* root) {
    vector<string> result;
    if(root!=NULL) dfspath(root,"",result);
    return result;
}

int main(){
    struct BinaryTreeNode *root;

    root = CreatBinaryTree();

    cout<<"二叉树总节点数为:"<<NodeNum(root)<<endl;

    cout<<"二叉树叶子节点数为:"<<LeafNum(root)<<endl;

    cout<<"二叉树最大深度(从根节点到最远叶子节点):"<<maxDepth(root)<<endl;

    cout<<"二叉树最小深度(从根节点到最近叶子节点):"<<minDepth(root)<<endl;

    cout<<"前序遍历结果:";
    PreOrderTraverse(root);
    cout<<endl;

    cout<<"中序遍历结果:";
    InOrderTraverse(root);
    cout<<endl;

    cout<<"后序遍历结果:";
    LastOrderTraverse(root);
    cout<<endl;

    cout<<"二叉树所有路径:\n";
    vector<string> allPaths = binaryTreePaths(root);
    for(auto e:allPaths) cout <<"\t" << e <<endl;

    return 0;
}
/*
测试用例:
3 9 0 0 20 15 0 0 7 0 0

1 2 0 5 0 0 3 0 0
*/

原文地址:https://www.cnblogs.com/yejifeng/p/11308183.html

时间: 2024-10-03 17:45:20

Cpp 二叉树的相关文章

二叉树遍历算法——包含递归前、中、后序和层次,非递归前、中、后序和层次遍历共八种

首先,要感谢网上的参考资料. http://mengliao.blog.51cto.com/876134/1178079(作者:BlackAlpha) http://blog.csdn.net/fzh1900/article/details/14056735(作者:_云淡风轻) http://blog.csdn.net/stpeace/article/details/8138458(作者:stpeace) 二叉树是使用的比较广泛的一种数据结构,这里我写了二叉树的相关操作,包括初始化.新建.以及遍

数据结构与算法 3:二叉树,遍历,创建,释放,拷贝,求高度,面试,线索树

[本文谢绝转载,原文来自http://990487026.blog.51cto.com] 树 数据结构与算法 3:二叉树,遍历,创建,释放,拷贝,求高度,面试,线索树 二叉树的创建,关系建立 二叉树的创建,关系建立2 三叉链表法 双亲链表: 二叉树的遍历 遍历的分析PPT 计算二叉树中叶子节点的数目:使用全局变量计数器 计算二叉树中叶子节点的数目:不使用全局变量计数器 无论是先序遍历,中序遍历,后序遍历,求叶子的数字都不变;因为本质都是一样的,任何一个节点都会遍历3趟 求二叉树的高度 二叉树的拷

洛谷U4727小L的二叉树[树 LIS]

题目背景 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣. 所以,小L当时卡在了二叉树. 题目描述 在计算机科学中,二叉树是每个结点最多有两个子结点的有序树.通常子结点被称作“左孩子”和“右孩子”.二叉树被用作二叉搜索树和二叉堆.随后他又和他人讨论起了二叉搜索树.什么是二叉搜索树呢?二叉搜索树首先是一棵二叉树.设key[p]表示结点p上的数值.对于其中的每个结点p,若其存在左孩子lch,则key[p]>key[lch]:若其存在右孩子rch,则k

二叉树。。。。

复习下二叉树,创建二叉树,分别以先序,中序,后续三种遍历访问二叉树,输出二叉树的叶子节点及叶子节点的个数,并输出二叉树的高度 [cpp] view plain copy #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> using namespace std; typedef struct BiTNode { char data; struct BiTNode *l

二叉树的深度和宽度

// 求二叉树的深度和宽度.cpp : 定义控制台应用程序的入口点. #include "stdafx.h" #include <iostream> #include <queue> using namespace std; struct BTNode { char m_value; BTNode *m_left; BTNode *m_right; }; //先序创建二叉树 void CreatBTree(BTNode *&root) { char nV

二叉树的建立与遍历(二)(c++实现)

[目标] 建立如下所示的一棵二叉树,并且输出其对应的前序遍历.中序遍历.后序遍历. [代码实现] // Binarytree.h #ifndef Binarytree_H #define Binarytree_H template<class T> class Binarytree; template<class T> class TreeNode { friend class Binarytree<T>; private: T data; TreeNode<T&

二叉树及排序二叉树的相关操作汇总

前记:由于种种原因,以前一看到什么树啊链表啊,那就相当的恐惧,真是惭愧,最近仔细研究了一下这些东西,发现也就那样,或许是我之前根本就没怎么花心思学.. 话不多说,下面就直接上代码吧,也没什么好解释的,只要我自己理解代码就行了,哈哈哈... 代码参考<C和C++程序员面试秘笈>一书 // Tree.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <stack> #include <queue>

二叉树的前序/中序/后续遍历(递归+非递归)

这几日又把二叉树的递归写了一遍,原来是用C写的,自己写了一个栈,这一次直接用的C++,使用了自带的栈结构.代码如下: 1 /************************************************************************* 2 > Author: Yves 3 > E-mail: [email protected] 4 > File Name: BiTreeNew.cpp 5 > Description: ... 6 > Cre

数据结构(4) -- 二叉树

//BinaryTree.h #ifndef BINARYTREE_H_ #define BINARYTREE_H_ #define ElemType int #define MAXSIZE 100 typedef struct _TreeNode { ElemType data; //存储的数据 _TreeNode* left; _TreeNode* right; }TreeNode; class BinaryTree { private: TreeNode *root; public: Bi