二叉树的建立和基本操作
2014-05-30 11:46
549 查看
树形结构要多利用递归来求解,递归的关键就是想清楚所有的基准情形,然后扩展到一般情况,写代码的时候最好把基准情况放在前面,把一般情况放在后面!
定义二叉树结构体:
创建二叉树:
比如二叉树为: 1
2
我们输入应为:1 2 0 0 0回车
先序遍历:
中序遍历:
后序遍历:
二叉树深度:
二叉树叶子节点数:
下面是整个程序的代码:
第一个二叉树为:
![](http://img.blog.csdn.net/20140530114132656?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGFvdGFvMTk5MDIyOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20140530110402546?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGFvdGFvMTk5MDIyOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
第二个二叉树为:
![](http://img.blog.csdn.net/20140530113953031?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGFvdGFvMTk5MDIyOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
定义二叉树结构体:
typedef struct BinaryTreeNode { TelemType data; struct BinaryTreeNode *Left; struct BinaryTreeNode *Right; }Node;
创建二叉树:
Node* createBinaryTree() { Node *p; TelemType ch; cin>>ch; if(ch == 0) //如果到了叶子节点,接下来的左、右子树分别赋值为0 { p = NULL; } else { p = (Node*)malloc(sizeof(Node)); p->data = ch; p->Left = createBinaryTree(); //递归创建左子树 p->Right = createBinaryTree(); //递归创建右子树 } return p; }注意:创建二叉树顺序为先中心节点,然后左子树,然后右子树,到了叶子节点后要把它的左右子树分别赋值为0
比如二叉树为: 1
2
我们输入应为:1 2 0 0 0回车
先序遍历:
void preOrderTraverse(Node* root) { if( root ) { cout<<root->data<<' '; preOrderTraverse(root->Left); preOrderTraverse(root->Right); } }
中序遍历:
void inOrderTraverse(Node* root) { if( root ) { inOrderTraverse(root->Left); cout<<root->data<<' '; inOrderTraverse(root->Right); } }
后序遍历:
void lastOrderTraverse(Node* root) { if( root ) { lastOrderTraverse(root->Left); lastOrderTraverse(root->Right); cout<<root->data<<' '; } }二叉树节点总数目:
int Nodenum(Node* root) { if(root == NULL) { return 0; } else { return 1+Nodenum(root->Left)+Nodenum(root->Right); } }
二叉树深度:
int DepthOfTree(Node* root) { if(root) { return DepthOfTree(root->Left)>DepthOfTree(root->Right)?DepthOfTree(root->Left)+1:DepthOfTree(root->Right)+1; } if( root == NULL ) { return 0; } }
二叉树叶子节点数:
int Leafnum(Node* root) { if(!root) { return 0; } else if( (root->Left == NULL) && (root->Right == NULL) ) { return 1; } else { return (Leafnum(root->Left) + Leafnum(root->Right)) ; } }
下面是整个程序的代码:
#include <iostream>分别输入两个二叉树来验证结果:
using namespace std;
typedef int TelemType;
typedef struct BinaryTreeNode { TelemType data; struct BinaryTreeNode *Left; struct BinaryTreeNode *Right; }Node;
//创建二叉树,顺序依次为中间节点->左子树->右子树
Node* createBinaryTree() { Node *p; TelemType ch; cin>>ch; if(ch == 0) //如果到了叶子节点,接下来的左、右子树分别赋值为0 { p = NULL; } else { p = (Node*)malloc(sizeof(Node)); p->data = ch; p->Left = createBinaryTree(); //递归创建左子树 p->Right = createBinaryTree(); //递归创建右子树 } return p; }
//先序遍历
void preOrderTraverse(Node* root) { if( root ) { cout<<root->data<<' '; preOrderTraverse(root->Left); preOrderTraverse(root->Right); } }
//中序遍历
void inOrderTraverse(Node* root) { if( root ) { inOrderTraverse(root->Left); cout<<root->data<<' '; inOrderTraverse(root->Right); } }
//后序遍历
void lastOrderTraverse(Node* root) { if( root ) { lastOrderTraverse(root->Left); lastOrderTraverse(root->Right); cout<<root->data<<' '; } }
//二叉树节点总数目
int Nodenum(Node* root) { if(root == NULL) { return 0; } else { return 1+Nodenum(root->Left)+Nodenum(root->Right); } }
//二叉树的深度
int DepthOfTree(Node* root) { if(root) { return DepthOfTree(root->Left)>DepthOfTree(root->Right)?DepthOfTree(root->Left)+1:DepthOfTree(root->Right)+1; } if( root == NULL ) { return 0; } }
//二叉树叶子节点数
int Leafnum(Node* root) { if(!root) { 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 = createBinaryTree();
printf("二叉树建立成功");
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;
}
第一个二叉树为:
第二个二叉树为:
相关文章推荐
- 二叉树的建立(非递归建立与定义建立)与基本操作(广度和深度遍历,求叶子树高)实现
- 二叉树的建立和基本操作
- 二叉树的建立与基本操作
- 二叉树的建立基本操作(链表方式)(一)
- 数据结构(C语言实现) - 二叉树的基本操作(建立,遍历,结点数,叶子结点数,高度,按树状打印,输出叶子结点等)
- 树 二叉树的建立和基本操作
- [数据结构] 二叉树的建立及其基本操作
- 二叉树建立及其基本操作
- 二叉树的建立和基本操作<一>
- C++二叉树结构的建立与基本操作
- 10. 二叉树的建立与基本操作
- 二叉树基本操作的递归实现(二叉树建立,先序,中序,后序,深度的递归遍历。广度优先,高度优先的非递归遍历)
- C++二叉树结构的建立与基本操作
- 二叉树的建立与基本操作
- 实验三 二叉树的基本操作(建立)及遍历
- 二叉树的建立及其基本操作
- 二叉树的建立和基本操作
- 实验三 二叉树的基本操作(建立)及遍历
- 二叉树的建立和基本操作(递归实现)
- 八.二叉树各种操作的C语言实现 树的一些基本的操作,包括,树的建立,树的深度,