二叉树与其它树

树:树是一个非空的有限元素的集合,其中一个元素为根(root),余下的元素(如果有的话)组成t的子树。

层次关系:层次中最高层的元素为根。其下级的元素是余下元素所构成子树的根。

兄弟:有相同父母的孩子为兄弟(sibling)
叶子:树中没有孩子的元素称为叶子。
树根是树中唯一一个没有父节点的元素。

二叉树

 

概念:t是一个有限个元素的集合(可以为空)。当二叉树非空时其中有一个称为根的元素,余下的元素(如果有的话)被组成二个二叉树,分别为t的左子树和右子树。

二叉树与树的根本区别:

  • 二叉树可以为空,但树不能为空
  • 二叉树的每个元素都恰好有两棵子树(其中一个或两个可能为空)。而树中每个元素可 有若干子树
  • 在二叉树中每个元素都是有序的,也就是说可以用左、右树来区别。而树的子树间是无序的。

二叉树地特性:

  1. 包含n个元素的二叉树的边数为n-1
  2. 若二叉树的高度为h,h>=0,则二叉树最少有h个元素,最多有2^h-1个元素。
  3. 包含n个元素的二叉树高度最大为n最小为log2(n+1)。 //这一点暂时不太懂。
  4. 设完全二叉树中一元素序号为i 1<=i<=n则有以下成立关系。(1)当i=1时,该元素为二叉树的根若i>1则该元素父节点的编号为i/2 (2)当2i>n时该元素无左孩子,否则其左孩子的编号为2i(3)若2i+1>n时,该元素无右孩子,否则其右孩子编号为2i+1。

二叉树的描述:

链表描述:

// BinaryTree.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

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

template<class T>
class BinaryTreeNode
{
public:

    BinaryTreeNode(){LeftChild = RightChild = 0;}
    BinaryTreeNode(const T & e) {LeftChild = RightChild = 0;data = e;}
    BinaryTreeNode(const T & e,BinaryTreeNode * l ,BinaryTreeNode * r)
    {
        data = e;
        LeftChild = l;
        RightChild = r;
    }

    T data;
    BinaryTreeNode<T> * LeftChild;
    BinaryTreeNode<T> * RightChild;
};

template<class T>
void Visit(BinaryTreeNode<T> * t)
{
    cout<<t->data;
}

//前序遍历
template<class T>
void PreOrder(BinaryTreeNode<T> *  t)
{
    if(t)
    {
        Visit(t);
        PreOrder(t->LeftChild);
        PreOrder(t->RightChild);
    }
}

//中序遍历
template<class T>
void InOrder(BinaryTreeNode<T> * t)
{
    if(t)
    {
        InOrder(t->LeftChild);
        Visit(t);
        InOrder(t->RightChild);
    }
}

//后序遍历
template<class T>
void PostOrder(BinaryTreeNode<T> * t)
{
    if(t)
    {
        PostOrder(t->LeftChild);
        PostOrder(t->RightChild);
        Visit(t);
    }
}

//输出完全括号化的中缀表达式
template<class T>
void Infix(BinaryTreeNode<T> * t)
{
    //输出表达示的中缀表达式
    if(t)
    {
        cout<<"(";
        Infix(t->LeftChild); //左操作数
        cout<<t->data;       //符号
        Infix(t->RightChild);//右操作数
        cout<<")";
    }
}

void Test()
{
    BinaryTreeNode<string> a1("a",0,0);
    BinaryTreeNode<string> a2("b",0,0);
    BinaryTreeNode<string> a3("*",&a1,&a2);

    BinaryTreeNode<string> a4("c",0,0);
    BinaryTreeNode<string> a5("d",0,0);
    BinaryTreeNode<string> a6("/",&a4,&a5);

    BinaryTreeNode<string> a7("+",&a3,&a6);
    PreOrder<string>(&a7);
    cout<<endl;
    InOrder<string>(&a7);
    cout<<endl;
    PostOrder<string>(&a7);
    cout<<endl;
    Infix<string>(&a7);
    cout<<endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
    Test();
    system("pause");
    return 0;
}

抽象数据类型BinaryTree

待序

二叉树与其它树

时间: 2024-08-05 14:59:49

二叉树与其它树的相关文章

SDUT 3340 数据结构实验之二叉树一:树的同构

数据结构实验之二叉树一:树的同构 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 给定两棵树T1和T2.如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是"同构"的.例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A.B.G的左右孩子互换后,就得到另外一棵树.而图2就不是同构的. 图1 图2 现给定两棵树,请你判断它们是否是同构的. Input 输入数据包含

树——用二叉树构建线段树

上一博文线段树问题中,用数组表示线段树,成功AC了,本文用二叉树表示线段树,复习一下二叉树,不过下面这段用二叉树代码表示的线段树是无法AC的,因为这个代码的空间复杂度远高于上一个用结构体数组表示的空间复杂度. #include<iostream> #include<cstdlib> #include<algorithm> #include<vector> #include<list> #include<iterator> #inclu

编程实现求一棵二叉树的最短树路径和最长树路径

Minimum Depth of Binary Tree Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the shortest path from the root node down to the nearest leaf node. class Solution { public: int minDepth(TreeNode *root) { if(!r

二叉树、B树、B+树、B*树、LSM树

HBase 对于数据产品,底层存储架构直接决定了数据库的特性和使用场景.RDBMS(关系型数据库)使用 B树 及 B+树 作为数据存储结构. HBase 使用 LSM树. . 二叉树  所有节点至多拥有两个子节点.节点左指针指向小于其关键字的子树,右指针指向大于其关键字的子树:B树搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中: B+树 数据的读取速度因素 由于传统的机械磁盘具有快速顺序读写.慢速随机读写的访问特性,这个特性对磁盘存储结构和算法的选择影响甚大. 为了改善数据访

二叉树的镜像树

public class 返回一个二叉树的镜像树{    // 层次遍历,左右调换    public void JingXiangTree(TreeNode root)    {        // 考虑特殊情况        if (root == null)        {            return;        }        if (root.left == null && root.right == null)        {            retur

数据结构——第三章树和二叉树:03树和森林

1.树的三种存储结构: (1)双亲表示法: #define MAX_TREE_SIZE 100 结点结构: typedef struct PTNode { Elem data; int parent; //双亲位置域 } PTNode; (2)孩子双亲链表表示法: typedef struct PTNode { Elem data; int parent; //双亲位置域 struct CTNode* nextchild; } *ChildPtr; (3)树的二叉链表(孩子-兄弟)存储表示法:

二叉树-二叉查找树-AVL树

一.二叉树 定义:每个节点都不能有多于两个的儿子的树. 二叉树节点声明: 1 struct treeNode 2 { 3 elementType element; 4 treeNode * left; 5 treeNode * right; 6 } 应用: 中缀表达式——>后缀表达式(栈的应用)——>表达式树(栈的应用2) 栈的应用2:读取后缀表达式,操作数入栈,遇操作符后,指向栈里前两位元素t1和t2的指针出栈(t1先弹出,作为该操作符的右儿子),并将指向该操作符的指针入栈. 二.二叉查找树

【转】二叉树、B树、B-树、B+树、B*树

二叉树 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: 二叉树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中: 否则,如果查询关键字比结点关键字小,就进入左儿子:如果比结点关键字大,就进入 右儿子:如果左儿子或右儿子的指针为空,则报告找不到相应的关键字: 如果二叉树的所有非叶子结点的左右子树的结点数目均保持差不多(平衡),那么二叉树 的搜索性能逼近

二叉树总结(一)树的遍历

该文我会用来总结二叉树相关的知识 二叉树如下图: 二叉树的结构 struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; 二叉树构造方法 为了测试二叉树的的各种算法,我不得不写一个二叉树的构造方法,我主要是用层次遍历的方式来构造二叉树的.层次遍历在后面会详细说到. 用字符串的方式来输入二叉树的序列,例如: 输入:1 2 3