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

上篇咱们说到二叉树的一种建立方法及三种遍历方法的递归非递归算法。这篇换了一种新的建立方法,用先根遍历递归的思路建立二叉树,用递归的方法计算深度,用中根递归和非递归方法遍历整个二叉树。

BinaryTree.h

//二叉树的建立和遍历
#ifndef BINARYTREE_H_
#define BINARYTREE_H_
#include <iostream>
typedef int T;
struct Node
{
	T data;
	Node *lch;
	Node *rch;
};
class BinaryTree
{
private:
	Node *root;
	Node *create_bt();
	void inorder(Node *p);
	int predepth(Node *t);
	void destroy(Node *p);
	int max(int x, int y);
public:
	BinaryTree()
	{
		root=NULL;
	}
	~BinaryTree()
	{
		destroy(root);
	}
	void create();
	void inorder()
	{
		inorder(root);
	}
	void inorderz();//中根非递归遍历
	int predepth(){return predepth(root);}//求二叉树的深度递归函数
};

#endif

BinaryTree.cpp

#include "BinaryTree.h"
#include <iostream>
#include <stack>

using namespace std;

void BinaryTree::create()
{
	cout<<"请按照二叉树先根次序,且将空孩子置为0,组织数据"<<endl;
	cout<<"每次输入结点的数据,假设是一棵3个结点的满二叉树。"<<endl;
	cout<<"那么输入应是:11 22 0 0 33 0 0"<<endl;
	root=create_bt();
}
Node *BinaryTree::create_bt()
{
	Node *t;
	int e;
	cout<<"输入结点的值:";
	cin>>e;
	if(e==0)
		t=NULL;
	else
	{
		t=new Node;
		t->data=e;
		t->lch=create_bt();
		t->rch=create_bt();
	}
	return t;
}
void BinaryTree::inorderz()//中根非递归遍历
{
	Node *p=root;
    Node *q;
    stack<Node *> S;
    do
    {
        while(p!=NULL)
        {
            S.push(p);
            p=p->lch;
        }
        p=S.top();
        S.pop();
        cout<<p->data<<" ";
        p=p->rch;
    }while(!(S.empty() && p==NULL));
}
void BinaryTree::inorder(Node *p)
{
	if(p!=NULL)
	{
		inorder(p->lch);
		cout<<p->data<<" ";
		inorder(p->rch);
	}
}
int BinaryTree::predepth(Node *t)
{
	if(t!=NULL)
	{
		return 1+max(predepth(t->lch),predepth(t->rch));
	}
	else
		return 0;
}
int BinaryTree::max(int x, int y)
{
	return (x>=y?x:y);
}
//用递归法删除二叉树的所有结点
void BinaryTree::destroy(Node *p)
{
	if(p!=NULL)
	{
		destroy(p->lch);
		destroy(p->rch);
	}
	delete p;
}

main.cpp

#include <iostream>
#include "BinaryTree.h"

using namespace std;

int main()
{
	BinaryTree BT;
	BT.create();
	cout<<"中根递归遍历:"<<endl;
	BT.inorder();
	cout<<"中根非递归遍历:"<<endl;
	BT.inorderz();
	cout<<endl<<"二叉树的深度为:"<<BT.predepth()<<endl;
	system("pause");
	return 0;
}

结果为:

时间: 2024-10-19 04:13:26

递归二叉树建立和遍历及深度计算的相关文章

二叉树建立和遍历

二叉树创建遍历规则: 1.先序:根-左-右 2.中序:左-根-右 3.后序:左-右-根 二叉树定义和辅助函数如下: struct node { int data; struct node* left; struct node* right; }; void visit(int data) { printf("%d ", data); } int indata() { int data; scanf("%d",&data); return data; } 先序

二叉树建立,遍历和二叉排序树的判断【c++】

// test.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> using namespace std; typedef struct BTree{ char val; struct BTree *lchild,*rchild; }BTree; //先序建立二叉树 BTree * CreateBTree(BTree *T

二叉树 - 建立与遍历使用Java

二叉树的遍历(traversing binary tree)是指从根节点出发,按照某种次序依次访问二叉树中所有节点,使得每个节点仅被访问一次 前序遍历:若二叉树为空,则空操作返回null.否则先访问根节点,然后前序遍历左子树,再前序遍历右子树 中序遍历:若二叉树为空,则空操作返回null.否则从根节点开始,中序遍历根节点左子树,然后访问根节点,最后中序遍历右子树 后序遍历:若二叉树为空,则空操作返回null.否则以从左到右先叶子后节点的方式遍历访问左右子树,最后访问根节点 层序遍历:若树为空,空

非递归二叉树的遍历

我们都知道,对二叉树进行递归遍历非常简单,但递归算法需要额外的栈机制来存储每次递归的值.既然递归算法内部使用栈实现的,那么我们也可以借助于栈来实现二叉树的非递归遍历.下面我们将讲解利用非递归实现二叉树的前序.中序和后序遍历. 1.非递归二叉树前序遍历: 我们知道,二叉树的前序遍历对节点的访问顺序是根节点.左子节点然后右自节点.根据其访问顺序我们可以很容易用栈来实现.具体实现思路如下: 1.遍历根节点的左子树,将每个节点的左子节点存入栈中,并在访问遍历的节点. 2.当遇到左子节点为空时,从栈中取出

数据结构二叉树——建立二叉树、中序递归遍历、非递归遍历、层次遍历

数据结构二叉树-- 编写函数实现:建立二叉树.中序递归遍历.借助栈实现中序非递归遍历.借助队列实现层次遍历.求高度.结点数.叶子数及交换左右子树. ("."表示空子树) #include<stdio.h> #include<stdlib.h> //***********二叉树链表节点结构 typedef char DataType; typedef struct Node {  DataType data;  struct Node*LChild;  struc

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

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

二叉树的建立和遍历(递归建树&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

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

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

二叉树的建立与遍历(二)(c++实现)

[目标] 建立如下所示的一棵二叉树,并且输出其对应的前序遍历.中序遍历.后序遍历. [代码实现] // Binarytree.h #ifndef Binarytree_H #define Binarytree_H template<class T> class Binarytree; template<class T> class TreeNode { friend class Binarytree<T>; private: T data; TreeNode<T&