码迷,mamicode.com
首页 > 其他好文 > 详细

数据结构(树)

时间:2017-10-10 21:49:46      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:pre   parent   blog   str   基本   程序   完全二叉树   size   create   

树的基本概念

(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;
	}
}

 

数据结构(树)

标签:pre   parent   blog   str   基本   程序   完全二叉树   size   create   

原文地址:http://www.cnblogs.com/yqy38/p/7647639.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!