创建二叉树并遍历二叉树

刚刚接触二叉树的同学一很想学习如何构建一颗简单的二叉树,下面我用C语言来实现一个简单的二叉树,并且用先序、中序和后序的方法来遍历它。

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
typedef struct node
//定义二叉树的节点
/*
可能有人不知道typedef是干什么用的
写了typedef后在定义结构体时就不用写struct node a;
直接写node a;就行了,比较方便
*/
{
    int data;
    struct node *ltree,*rtree;
}node;
node *cNode(int n)
{
    node *p;
    p=(node*)malloc(sizeof(node));//申请内存空间
    p->data=n;
    p->ltree=p->rtree=0;//左孩子与右孩子都为空
    return p;// 返回所创建节点(结构体)的指针
}
void mtree(node *par,node *lc,node *rc)//par父节点,lc左孩子,rc右孩子
{
    par->ltree=lc;
    par->rtree=rc;
}
void ztr(node *t)//中序遍历
{
	/*
	因为遍历左子树的方式与遍历左子树的左子树方式类似,所以可以用递归很方便的写出来
	代码很少,想着也简单,但计算机执行的过程是很复杂的
	*/
    if (t!=0)
    {
        ztr(t->ltree);//遍历左子树
        printf("%d",t->data);//输出根节点
        ztr(t->rtree);//遍历右子树
    }
}
void xtr(node *t)//先序遍历
{
    if (t!=0)
    {
        printf("%d",t->data); //输出根节点
        xtr(t->ltree);//遍历左子树
        xtr(t->rtree);//遍历右子树 

    }
}
void htr(node *t)//后序遍历
{
    if (t!=0)
    {
        htr(t->ltree);//遍历左子树
        htr(t->rtree);//遍历右子树
        printf("%d",t->data);//输出根节点
    }
} 

int main()
{
    int i,j,n;
    node *a,*b,*c,*d,*e,*f,*g;
    a=cNode(1);//创建一个节点,值为1;
    b=cNode(2);
    c=cNode(3);
    d=cNode(4);
    e=cNode(5);
    f=cNode(6);
    g=cNode(7);
    mtree(e,0,g); //e的做孩子为空,右孩子为g
	mtree(d,e,f);//将e和f分别作为d的左右孩子
	mtree(b,c,d);
	mtree(a,b,0);
	/*
	二叉树的样子应该是下面的样子(不知道能不能正常显示):

               a=1
              /
             b=2
            / \
           c=3 d=4
              / \
             e=5 f=6
              \
               g=7
	*/
	printf("中序遍历:");
	ztr(a);puts("");//中序遍历,再输出一个回车 ,puts("");是换行
	//////////////////////////////////////////
	printf("先序遍历:");
	xtr(a);puts("");
	//////////////////////////////////////////
	printf("后序遍历:");
	htr(a);puts("");
    system("pause");
    return 0;
}
时间: 2024-08-07 12:26:27

创建二叉树并遍历二叉树的相关文章

二叉树的创建、前序遍历、中序遍历、后序遍历

// BTree.cpp : Defines the entry point for the console application. /* 作者:成晓旭 时间:2001年7月2日(9:00:00-14:00:00) 内容:完成二叉树的创建.前序遍历.中序遍历.后序遍历 时间:2001年7月2日(14:00:00-16:00:00) 内容:完成二叉树的叶子节点访问,交换左.右孩子 */ #include "stdafx.h" #include "stdlib.h"

[算法系列之二]二叉树各种遍历

[简介] 树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用. 二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作"左子树"(left subtree)和"右子树"(right subtree).二叉树常被用作二叉查找树和二叉堆或是二叉排序树.二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒.二叉树的第i层至多有2的 i -1次方个结点:深度为k的二叉树至多有2^(k) -1个结点:对任何一棵二叉树T,

中序遍历二叉树-二叉树的非递归操作。。

问题描述 二叉树的非递归操作.. 如何用栈实现二叉树的非递归操作,越详细越好,谢谢各位啦.一定要详细哦 解决方案 void inOrder2(BinTree *root) //非递归中序遍历 { stack<BinTree*> s; BinTree *p=root; while(p!=NULL||!s.empty()) { while(p!=NULL) { s.push(p); p=p->lchild; } if(!s.empty()) { p=s.top(); cout<<

@数据结构大神:递归遍历二叉树,建立树的代码 为什么错?

问题描述 @数据结构大神:递归遍历二叉树,建立树的代码 为什么错? //创建-输入-打印-递归 # include<stdio.h> # include<stdlib.h> # include<malloc.h> typedef struct Node{ char data; struct Node *Lchild; struct Node *Rchild; }BiTNode,*BiTree; BiTree CreateBiTree(BiTree bt) { char

深入遍历二叉树的各种操作详解(非递归遍历)_C 语言

先使用先序的方法建立一棵二叉树,然后分别使用递归与非递归的方法实现前序.中序.后序遍历二叉树,并使用了两种方法来进行层次遍历二叉树,一种方法就是使用STL中的queue,另外一种方法就是定义了一个数组队列,分别使用了front和rear两个数组的下标来表示入队与出队,还有两个操作就是求二叉树的深度.结点数... 复制代码 代码如下: #include<iostream>#include<queue>#include<stack>using namespace std;/

遍历二叉树

一.基础知识     1. 遍历二叉树概念:如何按某条搜索路径寻访树中每个结点,使得每个结点均被访问一次,而且仅被访问一次.      2.遍历二叉树限定先左后右,则有三种情况先(根)序遍历,中(根)序遍历和后(根)序遍历           先序遍历二叉树定义操作                若二叉树为空,则空操作:否则:                a.访问根节点                b.先序遍历左子树                c.先序遍历右子树 //先序遍历 void

数据结构教程 第二十四课 遍历二叉树

教学目的: 掌握二叉树遍历的三种方法 教学重点: 二叉树的遍历算法 教学难点: 中序与后序遍历的非递归算法 授课内容: 一.复习二叉树的定义 二叉树由三个基本单元组成:根结点.左子树.右子树 问题:如何不重复地访问二叉树中每一个结点? 二.遍历二叉树的三种方法: 先序 1 访问根结点 2 先序访问左子树 3 先序访问右子树 中序 1 中序访问左子树 2 中序访问根结点 3 中序访问右子树 后序 1 后序访问左子树 2 后序访问右子树 3 访问根结点 三.递归法遍历二叉树 先序: Status(P

UVa 11234 Expressions:二叉树 层次遍历 广搜

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=103&page=show_problem&problem=2175 题目类型: 数据结构, 二叉树 题目大意: 一般情况下,都是中缀操作符, 如x+y.然后题目给出了一种后缀操作符的形式, 变成 x y +. 进行后缀操作可以用栈模拟,使用push,pop, 过程和经典的"括号匹配"差不

先序遍历二叉树的递归实现与非递归实现深入解析

以下是对先序遍历二叉树的递归实现与非递归实现进行了详细的分析介绍,需要的朋友可以过来参考下   1.先序遍历二叉树  递归实现思想:若二叉树为空,返回.否则 1)遍历根节点: 2)先序遍历左子树: 3)先序遍历右子树: 代码: 复制代码 代码如下: template<typename elemType> void PreOrder(nodeType<elemType> *root)  {      if(root==NULL)          return ;      visi