二叉树的递归与非递归

二叉树的递归和非递归算法:

(做这个的时候,总是逻辑跟不上,会搞混,做的时候发现自己对结构体指针的使用有些糊涂。)

代码如下:

#include <stdio.h>

#include <stdlib.h>

#define  Max 100

typedef struct Node

{

char Date;

struct Node *Lchild;   //左孩子

struct Node *Rchild;   //右孩子

}BiNode,*BiTree;

typedef struct    //树类型的结构体,顺序存储

{

BiTree date[Max];

int top;                 //控制栈顶

}SeqStack,*PseqStack;

void CreatTree( BiTree *root)         ////递归方式创建二叉树

{

char f;

f=getchar();

if(f==‘.‘)     //用.来代替孩子是空的情况

*root=NULL;

else

{

*root=(BiTree)malloc(sizeof(BiNode));  //分配空间

(*root)->Date=f;

CreatTree(&((*root)->Lchild));

CreatTree(&((*root)->Rchild));

}

}

//递归

void Visit(char Date)

{

printf("%c ",Date);

}

void PreOrder(BiTree root)                                  //  先序遍历

{

if(root)

{

Visit(root->Date);

PreOrder(root->Lchild);

PreOrder(root->Rchild);

}

}

void InOrder(BiTree root)                                  // 中序遍历

{

if(root)

{

InOrder(root->Lchild);

Visit(root->Date);

InOrder(root->Rchild);

}

}

void PostOrder(BiTree root)                                 //  后序遍历

{

if(root)

{

PostOrder(root->Lchild);

PostOrder(root->Rchild);

Visit(root->Date);

}

}

//非递归

PseqStack Init_SeqStack()

{

PseqStack S;

S=(PseqStack)malloc(sizeof(SeqStack));

S->top=-1;

return S;

}

int IsEmpty(PseqStack S)   //判空

{

if(S->top==-1)

return 1;

else

return 0;

}

int  Push(PseqStack S,BiTree x) //进栈

{

if(S->top==Max-1)

return 0;

else

S->top++;

S->date[S->top]=x;

return 1;

}

BiTree Pop(PseqStack S)    //出栈

{

if (!IsEmpty(S))

return S->date[S->top--];

}

void PreOrder1(BiTree root)         //非递归先序

{

PseqStack S;

BiTree p;

p=root;

S=Init_SeqStack();

while(p!=NULL||!IsEmpty(S))    //当树不是空树或栈不是空

{

while(p!=NULL)         //当树不是空树时

{

Visit(p->Date);     //访问根节点的元素

Push(S,p);         //将这个节点压入栈

p=p->Lchild;        //然后是左孩子,一直循环,按先序的方式。

}

if(!IsEmpty(S))        //栈不是空的,出栈,然后是右孩子。

{

p=Pop(S);

p=p->Rchild;

}

}

}

void InOrder1(BiTree root)             //非递归中须。

{

PseqStack S;

BiTree p;

p=root;

S=Init_SeqStack();

while(p!=NULL||!IsEmpty(S))

{

while(p!=NULL)

{

Push(S,p);

p=p->Lchild;

}

if(!IsEmpty(S))

{

p=Pop(S);

Visit(p->Date);

p=p->Rchild;

}

}

}

void PrintTree(BiTree Root,int n)  //输出图形

{

int i;

if(Root==NULL) return; //空树

PrintTree(Root->Rchild,n+1);

for(i=0;i<n;i++)   //控制空格

printf("  ");

printf("%c\n",Root->Date);

PrintTree(Root->Lchild,n+1);

}

int main (void)

{

BiTree Root;

int n=0;

printf("please input the bitree:\n");

CreatTree(&Root);

printf("the preorder bitree is  \n");

PreOrder(Root);

printf("\nthe InOrder bitree is  \n");

InOrder(Root);

printf("\nthe PostOrder bitree is  \n");

PostOrder(Root);

printf("\nthe non-recursive tree is (preorder)\n");

PreOrder1(Root);

printf("\nthe non-recursive tree is (inorder)\n");

InOrder1(Root);

printf("\nthe picture of bitree is :\n\n");

PrintTree(Root,n);

getch();

return 0;

}

By:暖暖

2014.11.19

时间: 2024-09-30 06:37:21

二叉树的递归与非递归的相关文章

数据结构——二叉树遍历之“递归与非递归遍历”

简述 二叉树的遍历分为先序遍历.中序遍历和后序遍历.如下图所示: 递归遍历 private void bianli1(List<Integer> list, TreeNode root) { // 先序遍历 if (root == null) { return; } list.add(root.val); bianli1(list, root.left); bianli1(list, root.right); } private void bianli2(List<Integer>

JAVA递归、非递归遍历二叉树(转)

原文链接: JAVA递归.非递归遍历二叉树 import java.util.Stack; import java.util.HashMap; public class BinTree { private char date; private BinTree lchild; private BinTree rchild; public BinTree(char c) { date = c; } // 先序遍历递归 public static void preOrder(BinTree t) {

Java数据结构系列之——树(4):二叉树的中序遍历的递归与非递归实现

package tree.binarytree; import java.util.Stack; /** * 二叉树的中序遍历:递归与非递归实现 * * @author wl * */ public class BiTreeInOrder { // 中序遍历的递归实现 public static void biTreeInOrderByRecursion(BiTreeNode root) { if (root == null) { return; } biTreeInOrderByRecursi

二叉树遍历递归与非递归实现

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 二叉树遍历是二叉树中非常基础的部分,也是学习二叉树必须熟练掌握的部分,下面我们先给出二叉树三种遍历方式的定义,并通过举例来说明二叉树遍历的过程. 二叉树的遍历分为:前序遍历(也叫先序遍历).中序遍历.后序遍历.所谓前.中.后都是根据当前子树根结点相对左右孩子的位置而言,也就是说: 前序遍历:根结点在前,即:根 ----->左------->右: 中序遍历:根结点在中间,即:左------>根------>右: 后序遍历:根结点在最

二叉树三种遍历(递归以及非递归实现)

package com.shiyeqiang.tree; import java.util.Stack; public class BiTree { public static void main(String[] args) { // 首先构造叶子节点 BiTree leafA1 = new BiTree(4); BiTree leafA2 = new BiTree(5); BiTree leafB1 = new BiTree(6); BiTree leafB2 = new BiTree(7)

二叉树遍历算法总结(递归与非递归)

一:前言 二叉树的遍历方法分四种:前序,中序,后序以及层次遍历. 其中,前中后遍历方法的实现分递归和非递归,非递归遍历的实现需要借助于栈. 实际上,递归的调用就是一种栈的实现,所以,非递归遍历就需要人工借助栈结构来实现. 而层次遍历需要借助队列. 二:前中后序遍历 递归遍历: 递归遍历的思想和方法很简单,通过调整输出语句来实现前,中,后三种遍历. 代码如下: 1 void show(BiTree T) 2 { 3 if(T) 4 { 5 printf("%c ",T->data)

二叉树递归与非递归遍历,最近公共父节点算法

#include <iostream> #include <stack> using namespace std; #define MAX 100 //字符串最大长度 typedef struct Node //二叉树结点 { char data; Node *lchild,*rchild; } *Btree; void createBT(Btree &t); //先序构造二叉树 void preorder(Btree &t); //二叉树递归先序遍历 void i

二叉树的前序、中序、后序遍历(递归、非递归)实现

本文部分来源于CSDN兰亭风雨大牛的原创.链接为http://blog.csdn.net/ns_code/article/details/12977901 二叉树是一种非常重要的数据结构,很多其他数据机构都是基于二叉树的基础演变过来的.二叉树有前.中.后三种遍历方式,因为树的本身就是用递归定义的,因此采用递归的方法实现三种遍历,不仅代码简洁且容易理解,但其开销也比较大,而若采用非递归方法实现三种遍历,则要用栈来模拟实现(递归也是用栈实现的).下面先简要介绍三种遍历方式的递归实现,再详细介绍三种遍

二叉树的递归和非递归遍历

// 本次练习的是  二叉树的  递归和非递归  遍历   以及二叉树的  节点数  高度  叶子节点数   和查找功能  //如果要是变量在函数栈回归时不回归原值,则可以用引用// #define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<stack>#include<queue>using namespace std; template<class T>struct BinaryTreeNod

Java数据结构系列之——树(5):二叉树的后序遍历的递归与非递归实现

package tree.binarytree; import java.util.Stack; /** * 二叉树后序遍历的递归与非递归实现 * * @author wl * */ public class BitreePostOrder { // 后序遍历的递归实现 public static void biTreePostOrderByRecursion(BiTreeNode root) { if (root == null) { return; } biTreePostOrderByRe