二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。
一棵深度为k,且有2^k-1个节点的二叉树,称为满二叉树。这种树的特点是每一层上的节点数都是最大节点数。而在一棵二叉树中,除最后一层外,若其余层都是满的,并且最后一层或者是满的,或者是在右边缺少连续若干节点,则此二叉树为完全二叉树。具有n个节点的完全二叉树的深度为floor(log2n)+1。深度为k的完全二叉树,至多有2k-1个叶子节点,至多有2k-1个节点。
#include<iostream> #include<stdio.h> #include<stdlib.h>using namespace std;typedef int TelemType; //定义二叉树节点 typedef struct BinaryTreeNode{TelemType data;struct BinaryTreeNode *Left;struct BinaryTreeNode *Right; }Node;//创建二叉树,中左右; Node* CreatBinaryTree() {Node *p;TelemType data;cin>>data;if(data==0)p=NULL;else{p=(Node*)malloc(sizeof(Node));p->data=data;p->Left=CreatBinaryTree();p->Right=CreatBinaryTree();}return p; } /****递归遍历*****/ void PreOrderTraverse(Node* root) {//前序if(root){cout<<root->data<<"\t";PreOrderTraverse(root->Left);PreOrderTraverse(root->Right);} } void InOrderTraverse(Node* root) {//中序if(root){PreOrderTraverse(root->Left);cout<<root->data<<"\t";PreOrderTraverse(root->Right);} } void LastOrderTraverse(Node* root) {//后序if(root){LastOrderTraverse(root->Left);LastOrderTraverse(root->Right);cout<<root->data<<"\t";} } int NodeNum(Node* root)//二叉树节点数目 {if(root==NULL)return 0;elsereturn 1+NodeNum(root->Left)+NodeNum(root->Right); }int DepthOfTree(Node *root)//树的深度; {if(root==NULL)return 0;elsereturn DepthOfTree(root->Left)>DepthOfTree(root->Right)?DepthOfTree(root->Left)+1:DepthOfTree(root->Right)+1;} int LeafNum(Node* 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() {Node *root = NULL;root=CreatBinaryTree();cout<<"创建二叉树成功"<<endl;cout<<"该二叉树节点总数"<<NodeNum(root)<<endl;cout<<"该二叉树深度"<<DepthOfTree(root)<<endl;cout<<"该二叉树叶子节点总数"<<LeafNum(root)<<endl;cout<<"前序遍历结果:"<<endl;PreOrderTraverse(root);cout<<endl;cout<<"中序遍历结果:"<<endl;InOrderTraverse(root);cout<<endl;cout<<"后序遍历结果:"<<endl;LastOrderTraverse(root);cout<<endl;return 0; }
二叉树的非递归遍历
https://www.cnblogs.com/SHERO-Vae/p/5800363.html