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

特此说明:上篇文章和这篇文章中的二叉树是链式二叉树的,不是顺序二叉树。

1、基本概述

A、层次遍历

摘自:http://blog.sina.com.cn/s/blog_5207b6c401009fq0.html

要采用的数据结构是队列。具体描述如下:

层次遍历:从上到下、从左到右依次访问结点。每次访问结点,就将该节点记录下来;若记录的所有结点都已经处理完毕,则结束遍历,否则重复下面的重装:

取出记录中第一个还没有访问的树的结点,若他有左子树,则访问左子树,并将其记录下来,否则,访问其右子树,并记录下来。

上面的算法中,记录结点就是入队操作,取出记录结点就是出队操作,这样一来,算法描述成下面的形式:

1)访问根节点,并将其根节点入队;

2)当队列不为空时,重复下列操作:

从队列出队一个结点;

若其有左子树,则访问左子树,并将其入队;

若其有右子树,则访问右子树,并将其入队;

B 、层次遍历

未使用队列完成层次遍历(我放到后面)

2、二叉树的深度计算

关键代码:

/// 二叉树---递归求得其深度
int depth(BinTreeNode *T)
{

    if (NULL == T)
    {
        return 0;
    }
    int leftDepth = depth(T->lchild);
    int rightDepth = depth(T->rchild);

    return leftDepth < rightDepth ? leftDepth + 1: rightDepth + 1;
}

递归实现求得其深度。

3、二叉树的结点个数统计

关键代码

/// 二叉树统计结点个数
int m_count(BinTreeNode *T)
{
    if (NULL != T)
    {
        return m_count(T->lchild) + m_count(T->rchild) + 1;
    }
    return 0;
}

递归完成对齐结点个数的统计。

4、层次遍历

注意:这里,不是使用队列完成层次遍历的。

/// 二叉树层次遍历输出
void PrintNodeAtLeves(BinTreeNode *T, int level)
{
    /// 空树或层级不合理
    if (NULL == T || level < 1)
    {
        cout << "空树或者层级不合理" << endl;
        return;
    }
    /// 若只有根节点
    if (1 == level)
    {
        cout << T->index << " ";
        return;
    }
    /// 左子树的level-1
    PrintNodeAtLeves(T->lchild, level - 1);

    /// 右子树的level-1
    PrintNodeAtLeves(T->rchild, level - 1);
}

/// 二叉树的层次遍历
void Level(BinTreeNode *T)
{
    if (NULL == T)
    {
        cout << "树T = NULL";
        return;
    }
    /// 获取树的深度
    int m_depth = depth(T);

    for (int i = 1; i <= m_depth; i++)
    {
        PrintNodeAtLeves(T, i);
        cout << endl;
    }
}

5、层次遍历(未使用队列)完成源码

#include <iostream>
using namespace std;
struct BinTreeNode
{
    int index;
    BinTreeNode *lchild;
    BinTreeNode *rchild;
};
/// 构建二叉树
BinTreeNode *create(BinTreeNode *T)
{
    int input = NULL;
    cout << "请输入数据:";
    cin >> input;

    if (0 == input)
    {
        T = NULL;
        return T;
    }
    T = (BinTreeNode *)malloc(sizeof(BinTreeNode));
    if (NULL == T)
    {
        cout << "内存分配失败" << endl;
        exit(1);
    }
    T->index = input;
    T->lchild = create(T->lchild);
    T->rchild = create(T->rchild);

    return T;
}
/// 二叉树统计结点个数
int m_count(BinTreeNode *T)
{
    if (NULL != T)
    {
        return m_count(T->lchild) + m_count(T->rchild) + 1;
    }
    return 0;
}

/// 二叉树---递归求得其深度
int depth(BinTreeNode *T)
{

    if (NULL == T)
    {
        return 0;
    }
    int leftDepth = depth(T->lchild);
    int rightDepth = depth(T->rchild);

    return leftDepth < rightDepth ? leftDepth + 1: rightDepth + 1;
}

/// 二叉树层次遍历输出
void PrintNodeAtLeves(BinTreeNode *T, int level)
{
    /// 空树或层级不合理
    if (NULL == T || level < 1)
    {
        cout << "空树或者层级不合理" << endl;
        return;
    }
    /// 若只有根节点
    if (1 == level)
    {
        cout << T->index << " ";
        return;
    }
    /// 左子树的level-1
    PrintNodeAtLeves(T->lchild, level - 1);

    /// 右子树的level-1
    PrintNodeAtLeves(T->rchild, level - 1);
}

/// 二叉树的层次遍历
void Level(BinTreeNode *T)
{
    if (NULL == T)
    {
        cout << "树T = NULL";
        return;
    }
    /// 获取树的深度
    int m_depth = depth(T);

    for (int i = 1; i <= m_depth; i++)
    {
        PrintNodeAtLeves(T, i);
        cout << endl;
    }
}

///主函数
int main(int argc, const char * argv[])
{
    /// 二叉树
    BinTreeNode *T = NULL;

    T = CreateBinTree(T);

    cout << "结点个数" << m_count(T) << endl;
    cout << "树的深度为:" << depth(T) << endl;

    cout << "层次遍历" << endl;
    Level(T);
    cout << endl;
}

6、运行结果:

时间: 2024-08-06 20:24:45

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

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

1.二叉树概念 这里,得先明白树的概念 摘自:维基百科 在计算机科学中,树(英语:tree)是一种抽象资料型别(ADT)或是实作这种抽象资料型别的数据结构,用来模拟具树状结构性质的资料集合.它是由n(n>=1)个有限节点组成一个具有层次关系的集合.把它叫做"树"是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的.它具有以下的特点: 每个节点有零个或多个子节点: 没有父节点的节点称为根节点: 每一个非根节点有且只有一个父节点: 除了根节点外,每个子节点可以分为多个不相交的

【LeetCode-面试算法经典-Java实现】【145-Binary Tree Postorder Traversal(二叉树非递归后序遍历)】

[145-Binary Tree Postorder Traversal(二叉树非递归后序遍历)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a binary tree, return the postorder traversal of its nodes' values. For example: Given binary tree {1,#,2,3}, 1 2 / 3 return [3,2,1]. Note: Recursive soluti

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

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

c语言二叉树的递归建立

#include <stdio.h> #include <string.h> #include <stdlib.h> #include <malloc.h> typedef struct node{ TYPE data; struct node *leff; struct node *right; }Node,*pNode; typedef char TYPE; typedef struct node{ TYPE data; struct node *lef

leetcode——Same Tree (二叉树的递归-先序遍历)

Same Tree Total Accepted: 56263 Total Submissions: 133912My Submissions Question Solution Given two binary trees, write a function to check if they are equal or not. Two binary trees are considered equal if they are structurally identical and the nod

数据结构二叉树的递归与非递归遍历之 实现可编译(1)java

前一段时间,学习数据结构的各种算法,概念不难理解,只是被C++的指针给弄的犯糊涂,于是用java,web,javascript,分别去实现数据结构的各种算法. 二叉树的遍历,本分享只是以二叉树中的先序遍历为例进行说明,中序遍历和后序遍历,以此类推! 二叉树递归与非递归遍历的区别,虽然递归遍历,跟容易读懂,代码量少,运算快,但是却容易出现溢出的问题,所以所以非递归遍历,在处理千万级的运算量时会先的很有用处. 二叉树的先序遍历:先访问根节点,再访问先后访问左右节点.如图: 二叉树的递归遍历之java

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

上篇咱们说到二叉树的一种建立方法及三种遍历方法的递归非递归算法.这篇换了一种新的建立方法,用先根遍历递归的思路建立二叉树,用递归的方法计算深度,用中根递归和非递归方法遍历整个二叉树. BinaryTree.h //二叉树的建立和遍历 #ifndef BINARYTREE_H_ #define BINARYTREE_H_ #include <iostream> typedef int T; struct Node { T data; Node *lch; Node *rch; }; class

小朋友学数据结构(3):二叉树的建立和遍历

小朋友学数据结构(3):二叉树的建立和遍历 一.基本概念 BinaryTree.png 二叉树:每个结点的子结点个数不大于2的树,叫做二叉树. 根结点:最顶部的那个结点叫做根结点,根结点是所有子结点的共同祖先.比如上图中的"7"结点就是根结点. 子结点:除了根结点外的结点,都叫子结点. 叶子结点:没有子结点的结点,叫做叶子结点.比如上图中的"1"结点."5"结点和"11"结点. 二叉树的遍历,有三种: (1)前序遍历:先遍历根

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