二叉树的三种递归遍历实现

声明:学过二叉树的童鞋可以跳过前面的故事,直接看最后的代码实现。 

你见过二叉树吗?一种很神奇的树,传说见到他的人都是幸运的。如果你没见过,好运立马降临:

怎么样?有被惊艳到吗?好运已经送到,祝你今晚睡得香甜。

好了,送完祝福,下面讲一个神奇的故事:

讲故事前,简单说说二叉树。

那么我要说的二叉树是什么呢?它是一种数据结构,数据结构是什么可以自行百度一下,这里不讨论他。举一个现实中的例子:把某个家庭看作一棵树,这家的爸爸(妈妈)有两个孩子,那么爸爸(妈妈)就是树的,俩孩子就是这棵树的叶子,而此时这种,孩子只有唯一父辈(爸爸妈妈看作一个整体),父辈或者没有孩子,或者有且最多有两个孩子的树就叫做二叉树,可以参考下图

就这样这个家族子子辈辈形成一个越来越高的二叉树。( 注意看它是倒过来的)

那么这个时候故事来了:有一家的的家谱非常奇特,它从第一页开始,翻阅者每次只能看到家谱的一页,这一页上记录着一个人的信息和他两个孩子在哪一页的指示页码,通过指示页码可以找到这两个孩子的信息存放页。不知道你有没有想象出来这个家谱的样子。大概是下面这个样子:

后面还有很多很多这样的书页。。。

然后有一个不知道是第几十辈孙子突发奇想,他想看看这本家谱上到底有多少先人,自己又是怎么来的。但是你知道在只有一个始祖页面的情况下,一个不漏的找出所有人,会有多少种路径够你找,还不一定能找全。。。。看似很难的样子,该怎么办?

然而,很巧的是这个孩子很勤奋,他学习过一种叫做二叉树的数据结构,还研究过它的遍历算法,直白点,就是把每一个点都访问一次。在这个21世纪互联网快速发展,计算机极度普及的年代,他只写了一段代码就搞定了,同时还用了三种方法,这个孩子很厉害啊,后生可畏!!!

故事结束

好了现在来看看二叉树的三种遍历算法(挺简单的,直接上代码)

因为根节点的左右子节点下面又是一棵二叉树,所以遍历就只考虑根、左、右三个节点的访问,访问就是看他在不在,即 if(p !=null),在,就输出他的信息,接着对左右子树使用相同的方法遍历即可。遍历没有返回值。(详见代码)

1.先序遍历

保证每个节点访问一次

2.中序遍历

3.后序遍历

有么有很简单,5行搞定,相信你已经理解了。

那么还有一个问题,我用这段遍历代码去遍历谁?遍历二叉树啊!那么二叉树从何而来,这就涉及到二叉树的节点定义,和二叉树的创建了。好,一起来看一下:

4.定义二叉树的节点

首先二叉树每个节点得有一个存储信息的变量,其次它得有左右子树的指针指向,那么就是下面这样了

5.二叉树的创建:

如果你理解了上面的先序遍历算法,那么创建也就很简单了,我们先输入一个字符,如果是空节点标志符,就相当于上一个插入的是根节点或是叶子节点了,这个节点就是空了,否则,插入这个信息,递归创建左右子树。看一下代码:

上面的代码是我从控制台输入数据,测试的时候用的,如果你是文件输入或者其他方式,相应做修改就行。

以上就是这篇文章的全部内容了,下篇再见。

时间: 2024-08-27 02:06:50

二叉树的三种递归遍历实现的相关文章

Java学习(十八):二叉树的三种递归遍历

二叉树的三种递归遍历: 1 public class StudentNode 2 { 3 private String name; 4 5 private StudentNode leftNode; 6 7 private StudentNode rightNode; 8 9 public String getName() 10 { 11 return name; 12 } 13 14 public void setName(String name) 15 { 16 this.name = na

C++实现二叉树的建立和三种递归遍历

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 二叉树是一种常见的数据结构,二叉树的遍历也是家常便饭的事了,这里仅仅写出一个完整的可以运行的C++代码来随便建立一个如下图所示的二叉树,建一棵二叉树是实现二叉树各种操作的基础,下面的程序也很简单,这只是二叉树练习的开始,以后的博文中,将会紧紧围绕这棵二叉树练习更多的操作:如求二叉树的大小,二叉树的深度,翻转二叉树...,这里只是基础中的基础,只是为以后的学习做铺垫. 下面给出C++代码,代码的功能包括: 1.建立如上图所示的简单的二叉树. 2.

二叉树的创建与三种递归遍历

#include<iostream>struct tree{ struct tree *left; struct tree *right; int data;};tree *T;typedef struct tree *Tree,*TNode,TREE;using namespace std;void PreCreateTree(Tree& T);void PreOrder(Tree& T);void InOrder(Tree& T);void PostOrder(Tr

二叉树的创建,和三种递归遍历方式

在运行窗口输入: A B D # # F E # # # C G # H # # I # # 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 typedef char ElementType; 5 typedef struct TNode *Position; 6 typedef Position BinTree; //二叉树类型 7 struct TNode { 8 ElementType Data; //结点数据 9 BinTree

三种递归遍历二叉树

1 #include <stdio.h> 2 #include <stdlib.h> 3 4 typedef int ElementType; 5 6 struct BinarySearchTreeNode 7 { 8 ElementType Element; 9 struct BinarySearchTreeNode *Left; 10 struct BinarySearchTreeNode *Right; 11 }; 12 13 int BinarySearchTreePreO

二叉树的三种遍历方式的循环和递归的实现方式

///////////////////头文件:BST.h//////////////////////// #ifndef BST_H #define BST_H #include "StdAfx.h" #include<iostream> #include<stack> template<typename DataType> class BST { public: class Node { public: Node(int data=0):m_dat

二叉树的三种遍历简单版

同学突然向我问二叉树的三种遍历代码.数据结构刚刚学了,自己很吃力的敲了出来. 和老师演示的代码有很大差距. #include <stdio.h>#include <string.h>#include <stdlib.h> #define Error -1#define Right 1 struct BiTnode{    char data;    struct BiTnode *LChild;    struct BiTnode *RChild; }; BiTnode

公交车站捡垃圾之二叉树的三种遍历方法

# 二叉树的遍历 今天下午看了二叉树的三种遍历方式,虽然能写出代码,但是理解可能不太到位,感觉很容易忘,所以想到一个形象的方法,把每个节点当作公交车站,而访问节点则是在这个公交车站捡垃圾,右子树和左子树则表示岔路.然后这个捡垃圾的人钟爱左边这个方向,所以一直以左优先.甲乙丙三个人,都爱捡垃圾,但是思考方式不同,所以捡垃圾的方法有点不同. 先序遍历 先序遍历最简单,秉承的原则是,甲很小心谨慎,每次经过公交车站,怕别人捡了,都把垃圾先捡到手,直到左边的路走完了,再往回走,但是回来的过程中,在公交车站

PTA 二叉树的三种遍历(先序、中序和后序)

6-5 二叉树的三种遍历(先序.中序和后序) (6 分) 本题要求实现给定的二叉树的三种遍历. 函数接口定义: void Preorder(BiTree T); void Inorder(BiTree T); void Postorder(BiTree T); T是二叉树树根指针,Preorder.Inorder和Postorder分别输出给定二叉树的先序.中序和后序遍历序列,格式为一个空格跟着一个字符. 其中BinTree结构定义如下: typedef char ElemType; typed