树的基本概念
(1)树(Tree)的概念:树是一种递归定义的数据结构,是一种重要的非线性数据结构。树可以是一棵空树,它没有任何的结点;也可以是一棵非空树,至少含有一个结点。
(2)根(Root):有且仅有一个结点的非空树,那个结点就是根。
(3)子树(Subtree):在一棵非空树中,除根外,其余所有结点可以分为m(m≥0)个互不相交的集合。每个集合本身又是一棵树,称为根的子树。
(4)结点(Node):表示树中的元素及若干指向其子树的分支。
(5)结点的度(Degree):一个结点拥有的子树数目称为该结点的度。
(6)叶子结点(Leaf):度为0的结点。
(7)孩子(Child):结点子树的根称为该结点的孩子。
(8)双亲(Parents):孩子结点的上层结点叫该结点的双亲。
(9)兄弟(Sibling):同一双亲的孩子。
(10)树的度:一棵树中最大的结点度数。
(11)结点的层次(Level):从根结点开始定义根为第一层,它的孩子为第二层,依此类推。
(12)深度(Depth):树中结点最大层次的值。
(13)有序树:树中的各子树自左向右有序的称为有序树。
(14)无序树:树中的各子树自左向右无序的称为无序树。
(15)森林(Forest):是m(m≥0)棵互不相交的树的集合。
(16)祖先:是指从根结点到该结点之间所有的结点。
二叉树(Binary Tree)
概念:二叉树又叫二分树,它的特点是每个结点最多只有二棵子树,也就是二叉树中没有度大于2的结点。二叉树的子树有左右之分,严格区分左孩子、右孩子,其次序不能颠倒。
满二叉树
概念:一棵深度为k且有2k-1个结点的二叉树称为满二叉树。
完全二叉树
概念:如果有深度为k的,有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1到n的结点一一对应时,称为完全二叉树。
二叉树的遍历
(1)先序遍历(先根遍历)
1. 访问根结点
2. 先序遍历左子树
3. 先序遍历右子树
(2)中序遍历(中根遍历)
1. 中序遍历左子树
2. 访问根结点
3. 中序遍历右子树
(3)后序遍历(后根遍历)
1. 后序遍历左子树
2. 后序遍历右子树
3. 访问根结点
c++代码
BTree.h
#ifndef BTREE_H
#define BTREE_H
struct BTreeNode {
int data;
BTreeNode *lChild, *rChild;
};
class BTree {
public:
void setRoot(BTreeNode* r) {
root = r;
}
BTreeNode* getRoot() { return root; }
BTreeNode* createBTree();
//中序遍历
void inOrder(BTreeNode*);
//前序遍历
void preOrder(BTreeNode*);
//后序遍历
void postOrder(BTreeNode*);
//计算节点数
int BTreeSize(BTreeNode*);
//计算子叶数
int BTreeLeaves(BTreeNode*);
//计算树高
int BTreeHeight(BTreeNode*);
private:
BTreeNode* root;
};
#endif
BTree.cpp
// BTree.cpp : 定义控制台应用程序的入口点。
//
#include <iostream>
#include <stack>
#include <queue>
#include "BTree.h"
#include "stdafx.h"
using namespace std;
BTreeNode* BTree::createBTree() {
BTreeNode* current = 0;
int val = 0;
cin >> val;
if (val == -1)
return NULL;
else {
current = new BTreeNode;
current->data = val;
current->lChild = createBTree();
current->rChild = createBTree();
return current;
}
}
//中序遍历
void BTree::inOrder(BTreeNode* r) {
if (r != 0) {
inOrder(r->lChild);
cout << r->data << " ";
inOrder(r->rChild);
}
}
//前序遍历
void BTree::preOrder(BTreeNode* r) {
if (r != 0) {
cout << r->data << " ";
preOrder(r->lChild);
preOrder(r->rChild);
}
}
//后序遍历
void BTree::postOrder(BTreeNode* r){
if (r != 0) {
postOrder(r->lChild);
postOrder(r->rChild);
cout << r->data << " ";
}
}
//计算节点数
int BTree::BTreeSize(BTreeNode* r) {
if (r == 0) return 0;
else
return 1 + BTreeSize(r->lChild) + BTreeSize(r->rChild);
}
//计算子叶数
int BTree::BTreeLeaves(BTreeNode* r) {
if (r == 0) return 0;
else if (r->lChild == 0 && r->rChild == 0)
return 1;
else
return BTreeLeaves(r->lChild) + BTreeLeaves(r->rChild);
}
//计算二叉树高度
int BTree::BTreeHeight(BTreeNode* r) {
if (r == 0) return 0;
else {
int lHei = BTreeHeight(r->lChild);
int rHei = BTreeHeight(r->rChild);
return (lHei > rHei) ? lHei + 1 : rHei + 1;
}
}