数据结构之二叉树的递归建立和遍历

1、二叉树概念

这里,得先明白树的概念

摘自:维基百科

在计算机科学中,(英语:tree)是一种抽象资料型别(ADT)或是实作这种抽象资料型别的数据结构,用来模拟具树状结构性质的资料集合。它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:

  • 每个节点有零个或多个子节点;
  • 没有父节点的节点称为根节点;
  • 每一个非根节点有且只有一个父节点;
  • 除了根节点外,每个子节点可以分为多个不相交的子树;

二叉树概念

摘自:维基百科

二叉树(英语:Binary tree)是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left
subtree
)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树二叉堆

二叉树的每个节点至多只有二棵子树(不存在度大于2的节点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有个结点;深度为k的二叉树至多共有个结点;对任何一棵二叉树T,如果其终端结点数为,度为2的节点数为,则

一棵深度为k,且有个节点称之为满二叉树;深度为k,有n个节点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中,序号为1至n的节点对应时,称之为完全二叉树

与树不同,树的节点个数至少为1,而二叉树的节点个数可以为0;树中节点的最大度数没有限制,而二叉树节点的最大度数为2;树的节点无左、右之分,而二叉树的结点有左、右之分。

2、特殊说明

二叉树的遍历,分为:先序遍历、中序遍历、后序遍历,层次遍历

-------  注意  -----

A、这里的先序、中序、后序,既然说到顺序,那么肯定有个参考点,对吧。 二叉树中的先序、中序、后序选择的参考点是:根节点。选择根为参考点,一定要记住。

B、先序、中序、后序中,无论哪种,一定要将树从最上面的根节点分成左子树和右子树,
然后再按照各自遍历顺序进行遍历整棵树。

先序:首先遍历根节点,紧接着遍历左子树,然后才是右子树。

中序:首先遍历左子树、紧接着遍历根节点、最后遍历右子树。

后序:首先遍历左子树,紧接着遍历右子树、最后遍历根节点。

层次遍历:从上到下、从左到右依次访问每个结点。

3、遍历举例

A

B

4、源码实现构建和遍历

这里的遍历:不包含层次遍历

#include <iostream>
using namespace std;

/// 构建结点
struct BinTreeNode
{
	int index;
	BinTreeNode *lchild;
	BinTreeNode *rchild;
};

/// 构建二叉树
BinTreeNode *create(BinTreeNode *T)
{
	int input;
	cout << "请输入数据:";
	cin >> input;
	if (0 == input)
	{
		T = NULL;
		return T;
	}
	T = (BinTreeNode *)malloc(sizeof(BinTreeNode));
	if (NULL == T)
	{
		cout << " 内存分配出错" << endl;
		exit(1);
	}
	T->index = input;
	T->lchild = create(T->lchild);
	T->rchild = create(T->rchild);

	return  T;
}

/// 先序遍历
void PreOrder(BinTreeNode *T)
{
	if (NULL != T)
	{
		cout << T->index << " ";
		PreOrder(T->lchild);
		PreOrder(T->rchild);
	}
}

/// 中序遍历
void InOrder(BinTreeNode *T)
{
	if (NULL != T)
	{
		InOrder(T->lchild);
		cout << T->index << " ";
		InOrder(T->rchild);
	}
}

/// 后序遍历
void PostOrder(BinTreeNode *T)
{
	if (NULL != T)
	{
		PostOrder(T->lchild);
		PostOrder(T->rchild);
		cout << T->index << " ";
	}
}

int main()
{
	BinTreeNode *T = NULL ;
	T = create(T);
	if (NULL == T)
	{
		cout << "T = NULL" << endl;
		exit(1);
	}

	cout << "先序遍历" << endl;
	PreOrder(T);

	cout  << endl << "中序遍历" << endl;
	InOrder(T);

	cout << endl << "后序遍历" << endl;
	PostOrder(T);

	cout << endl;
	system("pause");
	return 0;
}

5、测试结果:

时间: 2024-08-29 21:37:36

数据结构之二叉树的递归建立和遍历的相关文章

数据结构之二叉树的递归建立和遍历(续)

特此说明:上篇文章和这篇文章中的二叉树是链式二叉树的,不是顺序二叉树. 1.基本概述 A.层次遍历 摘自:http://blog.sina.com.cn/s/blog_5207b6c401009fq0.html 要采用的数据结构是队列.具体描述如下: 层次遍历:从上到下.从左到右依次访问结点.每次访问结点,就将该节点记录下来:若记录的所有结点都已经处理完毕,则结束遍历,否则重复下面的重装: 取出记录中第一个还没有访问的树的结点,若他有左子树,则访问左子树,并将其记录下来,否则,访问其右子树,并记

【LeetCode-面试算法经典-Java实现】【145-Binary Tree Postorder Traversal(二叉树非递归后序遍历)】

[145-Binary Tree Postorder Traversal(二叉树非递归后序遍历)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a binary tree, return the postorder traversal of its nodes' values. For example: Given binary tree {1,#,2,3}, 1 2 / 3 return [3,2,1]. Note: Recursive soluti

树(二叉树)的建立和遍历算法(一)(前序,中序,后序)

最近学习树的概念,有关二叉树的实现算法记录下来... 不过学习之前要了解的预备知识:树的概念:二叉树的存储结构:二叉树的遍历方法.. 二叉树的存储结构主要了解二叉链表结构,也就是一个数据域,两个指针域,(分别为指向左右孩子的指针),从下面程序1,二叉树的存储结构可以看出. 二叉树的遍历方法:主要有前序遍历,中序遍历,后序遍历,层序遍历.(层序遍历下一篇再讲,本篇主要讲的递归法) 如这样一个二叉树: 它的前序遍历顺序为:ABDGHCEIF(规则是先是根结点,再前序遍历左子树,再前序遍历右子树) 它

c语言二叉树的递归建立

#include <stdio.h> #include <string.h> #include <stdlib.h> #include <malloc.h> typedef struct node{ TYPE data; struct node *leff; struct node *right; }Node,*pNode; typedef char TYPE; typedef struct node{ TYPE data; struct node *lef

leetcode——Same Tree (二叉树的递归-先序遍历)

Same Tree Total Accepted: 56263 Total Submissions: 133912My Submissions Question Solution Given two binary trees, write a function to check if they are equal or not. Two binary trees are considered equal if they are structurally identical and the nod

数据结构二叉树的递归与非递归遍历之 实现可编译(1)java

前一段时间,学习数据结构的各种算法,概念不难理解,只是被C++的指针给弄的犯糊涂,于是用java,web,javascript,分别去实现数据结构的各种算法. 二叉树的遍历,本分享只是以二叉树中的先序遍历为例进行说明,中序遍历和后序遍历,以此类推! 二叉树递归与非递归遍历的区别,虽然递归遍历,跟容易读懂,代码量少,运算快,但是却容易出现溢出的问题,所以所以非递归遍历,在处理千万级的运算量时会先的很有用处. 二叉树的先序遍历:先访问根节点,再访问先后访问左右节点.如图: 二叉树的递归遍历之java

递归二叉树建立和遍历及深度计算

上篇咱们说到二叉树的一种建立方法及三种遍历方法的递归非递归算法.这篇换了一种新的建立方法,用先根遍历递归的思路建立二叉树,用递归的方法计算深度,用中根递归和非递归方法遍历整个二叉树. BinaryTree.h //二叉树的建立和遍历 #ifndef BINARYTREE_H_ #define BINARYTREE_H_ #include <iostream> typedef int T; struct Node { T data; Node *lch; Node *rch; }; class

小朋友学数据结构(3):二叉树的建立和遍历

小朋友学数据结构(3):二叉树的建立和遍历 一.基本概念 BinaryTree.png 二叉树:每个结点的子结点个数不大于2的树,叫做二叉树. 根结点:最顶部的那个结点叫做根结点,根结点是所有子结点的共同祖先.比如上图中的"7"结点就是根结点. 子结点:除了根结点外的结点,都叫子结点. 叶子结点:没有子结点的结点,叫做叶子结点.比如上图中的"1"结点."5"结点和"11"结点. 二叉树的遍历,有三种: (1)前序遍历:先遍历根

二叉树的建立和遍历(递归建树&amp;层序遍历建树)

#include<stdio.h>#include <cstdlib>#include <iostream>#include <stack>#include<queue>using namespace std; //二叉树定义typedef char ElementType;typedef struct Node *Position;typedef Position BinTree;struct Node{ ElementType data; B