二叉树的基本操作(递归版)

递归:

    二叉树的创建,遍历,求高度,求结点数,求叶子数。 递归写法很简单,不多说了。

  1 #include<iostream>
  2 using namespace std;
  3
  4 struct Node {
  5     char data;
  6     Node * lchild;
  7     Node * rchild;
  8 };
  9
 10 class Tree {
 11 public:
 12     Tree();
 13     ~Tree();
 14     Node * getRoot();
 15     void preTree(Node *);
 16     void inTree(Node *);
 17     void postTree(Node *);
 18     int getHigh(Node *);
 19     int getLeaf(Node *);
 20     int getNode_number(Node *);
 21 private:
 22     Node * root;
 23     Node * Create();
 24     void Delete(Node *);
 25 };
 26
 27 int main() {
 28
 29     Tree T;
 30     cout << "先序遍历:";
 31     T.preTree(T.getRoot());
 32     cout << endl << "中序遍历:";
 33     T.inTree(T.getRoot());
 34     cout << endl << "后序遍历:";
 35     T.postTree(T.getRoot());
 36     cout << endl << "高度:";
 37     cout << T.getHigh(T.getRoot());
 38     cout << endl << "结点数:";
 39     cout << T.getNode_number(T.getRoot());
 40     cout << endl << "叶子数:";
 41     cout << T.getLeaf(T.getRoot());
 42
 43     system("pause");
 44 }
 45
 46 int Tree::getLeaf(Node * root) {
 47     int Left = 0, Right = 0;
 48     if (root->lchild == NULL && root->rchild == NULL) {        // 左右孩子都为空,表示是叶子 ,返回叶子个数 1
 49         return 1;
 50     }
 51     else if (root->lchild == NULL) {    // 左孩子为空,就递归该结点的右子树
 52         Right = getLeaf(root->rchild);
 53         return Right;
 54     }
 55     else if(root->rchild == NULL) {        // 右孩子为空,就递归该结点的左子树
 56         Left = getLeaf(root->lchild);
 57         return Left;
 58     }
 59     else {                                // 左右孩子都不空,就先递归该结点的左子树,然后递归该结点的右子树
 60         Left =  getLeaf(root->lchild);
 61         Right = getLeaf(root->rchild);
 62         return Left + Right;
 63     }
 64 }
 65
 66 int Tree::getHigh(Node * root) {
 67     int Left = 0, Right = 0;
 68     if (root == NULL) {
 69         return 0;
 70     }
 71     else {
 72         Left = getHigh(root->lchild);
 73         Right = getHigh(root->rchild);
 74         return Left > Right ? (Left + 1) : (Right + 1);
 75     }
 76 }
 77
 78 int Tree::getNode_number(Node * root) {
 79     int Left = 0, Right = 0;
 80     if (root == NULL) {
 81         return 0;
 82     }
 83     else {
 84         Left = getNode_number(root->lchild);
 85         Right = getNode_number(root->rchild);
 86         return Left + Right + 1;
 87     }
 88 }
 89
 90 Node * Tree::Create() {
 91     Node * node;
 92     char ch;
 93     cin >> ch;
 94     if (ch == ‘#‘) {
 95         node = NULL;
 96     }
 97     else {
 98         node = new Node();
 99         node->data = ch;
100         node->lchild = Create();
101         node->rchild = Create();
102     }
103     return node;
104 }
105
106 void Tree::Delete(Node * root) {
107     if (root != NULL) {
108         Delete(root->lchild);
109         Delete(root->rchild);
110         delete root;
111     }
112 }
113
114 Tree::Tree() {
115     root = Create();
116 }
117
118 Tree::~Tree() {
119     Delete(root);
120 }
121
122 Node * Tree::getRoot() {
123     return root;
124 }
125
126 void Tree::preTree(Node * root) {
127     if (root == NULL) {
128         return;
129     }
130     else {
131         cout << root->data << " ";
132         preTree(root->lchild);
133         preTree(root->rchild);
134     }
135 }
136
137 void Tree::inTree(Node * root) {
138     if (root == NULL) {
139         return;
140     }
141     else {
142         inTree(root->lchild);
143         cout << root->data << " ";
144         inTree(root->rchild);
145     }
146 }
147
148 void Tree::postTree(Node * root) {
149     if (root == NULL) {
150         return;
151     }
152     else {
153         postTree(root->lchild);
154         postTree(root->rchild);
155         cout << root->data << " ";
156     }
157 }
时间: 2024-10-18 16:26:15

二叉树的基本操作(递归版)的相关文章

第4章第3节 二叉树的基本操作(非递归实现)

二叉树的非递归遍历 上一节二叉树的递归遍历中简单介绍了二叉树的递归遍历的实现方式,本节主要介绍二叉树的非递归遍历实现,继续引用上节的例子来说明下. 一.先序遍历 二叉树先序遍历的访问顺序为:根结点->左孩子->右孩子.简单的说,对于任意一个结点,均可以看作是根结点,直接对其访问,如果访问完成后,左孩子不为空,则可以将该左孩子再次看成一个新的根结点,那么就又回到开始,访问根结点,访问左孩子,如果左孩子为空时,访问它的右孩子.对于一般程序而言,递归程序转为非递归程序需要引入栈这个数据结构,可以参考

&lt;二叉树的基本操作&gt;

#include<stdio.h> #include<stdlib.h> #include<string.h> #define num 100 #define OK 1 typedef int Status; typedef char DataType; typedef struct node { DataType data; struct node *lchild,*rchild; }BinTNode,*BinTree; Status CreateBiTree(Bin

打印菜单界面,用c语言实现二叉树的基本操作

打印菜单界面,用c语言实现二叉树的基本操作: 其代码原理和用c++实现一样,请看本人上篇博客:二叉树的先序.中序.后序遍历等基本操作c++实现,链接:http://yaoyaolx.blog.51cto.com/10732111/1783527 实现代码: #include <stdio.h> #include <stdlib.h> #define MAXSIZE 50 //定义二叉树的二叉链表结构 typedef struct Node { char data; struct N

数据结构(复习)--------关于二叉树的基本操作

// // 关于数据结构的总结与复习 Coding //关于二叉树的建立以及层次,其他遍历(递归,非递归)求深度等基本操作 #include <cstdio> #include <cstdlib> //#define _OJ_ typedef struct tree { char data; struct tree *left; struct tree *right; } tree, *Bitree; typedef struct Stack1 { int top, base; B

《二叉树的基本操作》

1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 5 #define NUM 100 //二叉树的最大结点数 6 #define QueueSize 100 //队列初始容量 7 #define TRUE 1 8 #define FALSE 0 9 #define OK 1 10 #define ERROR 0 11 #define OVERFLOW -1 12 13 typedef int

&lt;二叉树的基本操作(有层次遍历)&gt;

#include<stdio.h> #include<stdlib.h> #include<string.h> #define num 100 #define OK 1 #define ERROR 0 #define OVERFLOW -1 #define FALSE 0 #define TRUE 1 typedef int Status; typedef char DataType; typedef struct node { DataType data; struc

二叉树的非递归遍历--京东2015笔试回忆

题目回忆: C/C++研发试卷:偏重于数据结构的考察,编程题有2题+1题附加题: 1.输入整数n,求m,m>9,m中各个数位的乘积=n的最小整数;如n=36,m=49; 2.二叉树前序遍历的非递归实现(本文的总结) 3.求第n个数,这个序列满足(2^i)*(3^j)*(5^k),前7个为:2,3,4,5,6,8,10 .... 小题有基本的数据结构.程序运行结果.SQL题目. 4.删除表格用DROP命令,死锁产生的条件: 4.1互斥使用(资源独占) 一个资源每次只能给一个进程使用 4.2.不可强

二叉树的非递归实现

之前一直觉得二叉树使用递归来实现就感觉有点绕,今天才发现二叉树使用非递归来实现更加的绕,但是考虑到我们得使用非递归来提高二叉树的遍历效率,使用非递归是一种比较好的方法. 三种递归遍历对遍历的描述,思路非常简洁,最重要的是三种方法完全统一,大大减轻了我们理解的负担.现在非递归使用栈来实现,利用了栈的先进后出的特点,可以解决. 二叉树的递归实现之前已经实现过了,我们直接实现非递归.并且都使用栈实现 (一)前序遍历 对于前序遍历,我们要解决的问题是何时压入左右子树?先压左子树还是右子树? 答案是显而易

二叉树遍历,递归,栈,Morris

一篇质量非常高的关于二叉树遍历的帖子,转帖自http://noalgo.info/832.html 二叉树遍历(递归.非递归.Morris遍历) 2015年01月06日 |  分类:数据结构 |  标签:二叉树遍历 |  评论:8条评论 |  浏览:6,603次 二叉树遍历是二叉树中最基本的问题,其实现的方法非常多,有简单粗暴但容易爆栈的递归算法,还有稍微高级的使用栈模拟递归的非递归算法,另外还有不用栈而且只需要常数空间和线性时间的神奇Morris遍历算法,本文将对这些算法进行讲解和实现. 递归

POJ 1780 Code (欧拉回路+非递归版dfs)

题目地址:POJ 1780 还是求序列的欧拉回路.只不过这题有两坑. 第一坑是用数字来当点的话,会MLE,因为每个数字可以连10条边,100w条边会MLE,即使用vector也会TLE.这题可以用边来记录,对于n为1时直接输出,然后后面的,比如12,23这两个点就用边权值为123来表示这两个点,这样就把点和边的范围都缩小了10倍. 第二坑是用递归的dfs会爆栈,亲测即使加手扩栈也会爆..(简直丧心病狂..)需要用非递归版dfs,也不难,dfs本身就是利用的栈,所以改成栈的形式就可以了. 代码如下