二叉树的遍历与建立

二叉树简介

  二叉树是一种非线性结构,二叉树的遍历方式有三种:前序、中序和后序。  在学习二叉树的时候,把二叉树分为三部分:根结点,左子树和右子树,所谓遍历方式即访问这三部分的先后顺序。
我对于二叉树遍历的方式的理解是這样的:
前序遍历:先访问根结点,再访问左子树,最后访问右子树。
中序遍历:先访问左子树,再访问根节点,最后访问右子树。
后序遍历:先访问左子树,再访问右子树,最后访问根结点。

1.二叉树的建立

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
#include<assert.h>
#include<stack>
#include<queue>
using namespace std;
template<class T>
struct BinaryTreeNode
{
    T _data;
    BinaryTreeNode<T>* _left;
    BinaryTreeNode<T>* _right;
    BinaryTreeNode(const T& d)
         :_data(d)
         ,_left(NULL)
         , _right(NULL)
    {
         cout << "构造二叉树结点" << endl;
    }
};
template<class T>
class BinaryTree
{
    typedef BinaryTreeNode<T> Node;
private:
    Node* _root;
protected:
    Node* _CreateTree(T* a, size_t n, const T& invalid, size_t& index)
    {
         //index = 0;           Node* root = NULL;
         if (index < n && a[index] != invalid)
         {
             root = new Node(a[index]);
             root->_left = _CreateTree(a, n, invalid, ++index);
           root->_right = _CreateTree(a, n, invalid, ++index);
         }
         return root;
    }2.前中后序遍历
    void _PrevOrder(Node* root)    //前序遍历
    {
         if (root == NULL)       //返回条件
             return;
         cout << root->_data << " ";
         _PrevOrder(root->_left);
         _PrevOrder(root->_right);
    }    void _InOrder(Node* root)    //中序遍历    {         if (root == NULL)       //返回条件             return;         _InOrder(root->_left);                      cout << root->_data << " ";         _InOrder(root->_right);    }    void _PostOrder(Node* root)   //后序遍历    {         if (root == NULL)        //返回条件             return;         _PostOrder(root->_left);         _PostOrder(root->_right);         cout << root->_data << " ";    }

原文地址:https://www.cnblogs.com/amema/p/10781134.html

时间: 2024-10-16 11:19:29

二叉树的遍历与建立的相关文章

采用先序遍历 和层次遍历递归建立二叉树--进行封装

1 package com.offer; 2 3 public class TreeNode { 4 5 int val = 0; 6 TreeNode left = null; 7 TreeNode right = null; 8 9 public TreeNode(int val) 10 { 11 this.val=val; 12 } 13 14 public TreeNode() 15 { 16 CreateBinaryTree();// 采用默认的 17 //preShow(this.r

Java数据结构-二叉树及其遍历

二叉树的定义:n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互相不相交的.分别称为根结点的左子树和右子树的二叉树组成. 二叉树的特点: 0<=度<=2: 左右子树是有顺序的,不能颠倒: 不论有几棵子树,也要区分它是左子树还是右子树. 二叉树的五种基本形态: 空二叉树: 只有一个根结点: 根结点只有左子树: 根结点只有右子树: 根结点既有左子树又有右子树. 举例3个结点的二叉树的形态有: 下面说一些特殊的二叉树. 斜树:所有的结点都只有左子树的二叉

【转】算法之二叉树各种遍历

http://blog.csdn.net/sjf0115/article/details/8645991 树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用. 二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree).二叉树常被用作二叉查找树和二叉堆或是二叉排序树.二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒.二叉树的第i层至多有2的 i -1次方个结点:

数据结构第三部分:树与树的表示、二叉树及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树、集合及其运算

参考:浙大数据结构(陈越.何钦铭)课件 1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R 中找出关键字与K 相同的记录).一个自然的问题就是,如何实现有效率的查找? 静态查找:集合中记录是固定的,没有插入和删除操作,只有查找 动态查找:集合中记录是动态变化的,除查找,还可能发生插入和删除 静态查找——方法一:顺序查找(时间复杂度O(n)) int

二叉树重建及二叉树广度优先遍历

#include <iostream> #include <queue> using namespace std; //树节点类 class TNode { public: TNode *left, *right; char value; TNode() { left = right = NULL; } TNode(char v) { left = right = NULL; value = v; } }; //根据二叉树的先序遍历和中序遍历重建二叉树 //PreOrder为二叉树

算法之二叉树各种遍历

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

线索二叉树的遍历应用

线索二叉树的遍历,就是在已经建立后的线索二叉树中,根据线索查找结点的前驱和后继.利用在线索二叉树中查找结点的前驱和后继的思想,遍历线索二叉树. #include <stdio.h> #include <stdlib.h> #include <malloc.h> #define MAXSIZE 100 typedef char ElemType; typedef enum { Link,/*指向孩子结点*/Thread/*指向前驱或后继*/ } PointerTag; t

二叉树各种遍历

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

二叉树的遍历及线索二叉树

"."代表空树,程序分别以先序.中序和后序的方式递归遍历二叉树,再以中序非递归的方式遍历二叉树,并以中序递归方式输出叶子结点并统计叶子结点的个数.最后将二叉树线索化并中序遍历线索二叉树. #include "stdio.h" #include "stdlib.h" typedef struct bithrnode { char data; int ltag,rtag; struct bithrnode *lchild,*rchild; }Bith