二叉树的建立及其前中后序遍历

 1 //二叉树存储结构:
 2 struct node
 3 {
 4     Int data;
 5     node *lchild;
 6     node *rchild;
 7 };
 8
 9 //二叉树在建树前根节点不存在:
10 Node *root = NULL;
11
12 //新建结点:
13 node *newNode(int v)
14 {
15     node *Node = new node;
16     Node->data = v;
17     Node->lchild = NULL;
18     Node->rchild = NULL;
19     return Node;
20 }
21
22 //二叉树结点的查找、修改:
23 void search(node *root,int x,int newdata) // 在这里修改的是root指针指向的内容,所以不需要加引用&
24 {
25     if(root == NULL)
26         return;
27     if(root->data == x)
28         root->data = newdata;
29     search(root->lchild,x,newdata);
30     search(root->rchild,x,newdata);
31 }
32
33 //二叉树的插入:
34 void insert(node *&root,int x) // 这里要加引用,是因为修改的是root指针本身
35 {
36     if(root == NULL)
37     {
38         root = newNode(x);
39         return root;
40     }
41     if(x<=root->data)   // 生成二叉查找树
42         insert(root->lchild,x);
43     else
44         insert(root->rchild,x);
45 }
46
47 //二叉树的创建:
48 node *create(int data[],int n)
49 {
50     node *root = NULL;
51     for(int i=0;i<n;++i)
52         insert(root,data[i]);
53     return root;
54 }

二叉树的遍历:
遍历方法一般有四种,先序遍历、中序遍历、后序遍历、层次遍历,前三种的前中后指的是根结点root在遍历中的位置。

 1 void preorder(node *root) // 对于先序遍历,序列第一个一定是根结点
 2 {
 3     if(root==NULL)
 4         return;
 5     cout << root->data;
 6     preorder(root->lchild);
 7     preorder(root->rchild);
 8 }
 9
10 void inorder(node *root) //中序遍历总把根结点放在左子树和右子树中间
11 {
12     if(root==NULL)
13         return;
14     inorder(root->lchild);
15     cout << root->data;
16     inorder(root->rchild);
17 }
18
19 void postorder(node *root) //后序遍历中的序列最后一个一定是根结点
20 {
21     if(root==NULL)
22         return;
23     postorder(root->lchild);
24     postorder(root->rchild);
25     cout << root->data;
26 }
27
28 void LayerOrder(node *root) //根据题意,原存储结构可能要加入layer记录层数
29 {
30     queue<node*> q; // 队列中的数据类型是指针,这样可以方便有时层序遍历的时候修改数据
31     q.push(root);
32     while(!q.empty())
33     {
34         node *now = q.front();
35         q.pop();
36         if(now->lchild!=NULL)
37             q.push(now->lchild);
38         if(now->rchild!=NULL)
39             q.push(now->rchild);
40     }
41 }

推论:中序序列可以与先序序列、后序序列、层序序列中的任意一个来构建唯一的二叉树
例如:先序序列和中序序列搭配:

 1 node *create(int preL,int preR,int inL,int inR) // preL,preR是先序序列的区间
 2 {
 3     if(preL>preR) //先序序列长度小于等于0时,直接返回
 4         return NULL;
 5     node *root = new node;
 6     root->data = pre[preL];
 7     int k;
 8     for(k=inL;i<=inR;++i) { if(in[k]==pre[preL]) break; } int num = k-inL; // num是左子树结点个数 root->lchild = create(preL+1,preL+num,inL,k-1);
 9     root->rchild = create(preL+num,preL+num+1,k+1,InR);
10     return root;
11 }

原文地址:https://www.cnblogs.com/kachunyippp/p/10256793.html

时间: 2024-11-05 18:28:44

二叉树的建立及其前中后序遍历的相关文章

二叉树的前序建立,前中后序遍历的非递归算法

二叉树的前序建立递归算法以及前中后序遍历的递归算法已经是人尽皆知了,递归算法也确实为代码的编写带来了很大的方便.然而,有时我们也确实需要它们的非递归算法.将递归算法转化为非递归算法可以帮助我们深入了解函数的调用与栈的原理.这里总结一下二叉树的这些重要的非递归算法. 一.前序建树 前序建树的基本思路是,接收用户输入的一组字符串,其中'#'代表空树,其他代表树结点的数据域值.例如,要建立如下一棵树 需要输入"AB#D##C##". 而非递归的思路是,1.设一个标志位来判断当前创建的结点是左

二叉树的前中后序遍历简单的递归

二叉树的遍历 无外乎广度和深度 其中深度又分为前中后序遍历三种情况  这三种遍历若只是递归方法 自然很是简单 但递归代码简单 若嵌套层次太深 会栈溢出 二叉树节点数据结构: struct Binary_node{    int val;    Binary_node *left;    Binary_node *right;    Binary_node(int v = 0, Binary_node *le = nullptr, Binary_node *ri = nullptr) :val(v

002.深入浅出理解[二叉树的构建、先中后序遍历、树的深度、左右子树互换]

二叉树本来就是递归定义的,如果对递归还不是特别了解,建议看一下<001.深入浅出解释[递归]> 写一个递归函数很简单,只需要记住下面2点: 1.递归中止条件:对于二叉树来说一般是node==null的时候判断到了叶子结点 2.递归函数::描述一个中间过程,然后用代码实现,调用自身的时候传递的参数就是你想要递归的方式. 下面的代码就是一个二叉树的创建.先中后序遍历.树的深度.左右子树的互换的过程 #include <stdio.h> // 定义二叉树的结点 struct treeNo

非递归前中后序遍历二叉树

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 写在前面: 最近准备找工作,捡起原来学习过的各种知识,加上一些自己的理解,梳理一下流程,巩固自己的认识,一步两步,一步两步... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 二叉树的遍历是树操作的基础,一般的前中后序递归遍历比较简单,这里就不列出了,主要是非递归实

二叉树的前中后序遍历

#include<stdio.h> #include<string.h> #include<stdlib.h> #define Size 100 #define Resize 10 typedef struct Bitnode{ //定义结点 char data; struct Bitnode *lchild,*rchild; }Bitnode,*Bitree; typedef struct Stack{ //定义栈 Bitree *base; int top; int

POJ 2255 Tree Recovery &amp;&amp; Ulm Local 1997 Tree Recovery (二叉树的前中后序遍历)

链接:poj.org/problem?id=2255 题意: 分别给你一个二叉树的前序遍历序列和中序遍历序列,让你给出这个二叉树的后序遍历序列. 思路: 对于二叉树的三种遍历方式,都可以使用递归来实现,那么也一定可以使用递归来拆解,以达到从遍历序列确定二叉树具体结构的目的.对于前序遍历来说,第一个字母一定是根,并且在序列中根的左子树包含的点一定出现在根的右子树的前面.对于中序遍历序列来说,根前面出现的字母所代表的点一定出现在左子树中,根后面出现的字母所代表的点一定出现在右子树中.在根据前序与中序

【数据结构】 非递归前中后序遍历二叉树

数据结构学的递归了,深入了解后写一个三序非递归的版本. //测试数据:abd##eg##h##c#f## #include <cstdio> #include <iostream> typedef char ElemType; typedef struct Node { ElemType elem; struct Node *lchild,*rchild; }Node,*BiTree; typedef struct{ BiTree *base; BiTree *top; int s

二叉树系列 - 二叉树的前/中/后序遍历(非递归)

二叉树的遍历是二叉树中最最基础的部分. 这里整理二叉树不用递归实现三种顺序遍历的方式. 不用递归的话,一般需要栈来完成.当然线索二叉树(不需要栈或递归)也可以完成中序遍历,这种方式在这篇文章中已经讨论过.这里着重讨论使用栈的实现方式. 中序遍历 (1) 双while,第二个内层while是为了不断压入left child. vector<int> inorderTraversal(TreeNode *root) { vector<int> v; if(!root) return v

二叉树的前中后序遍历迭代&amp;广度遍历

递归很是简单 但也应该掌握其迭代方式的遍历方法 这三种的迭代遍历方法需要通过栈来存储节点 尤其是后序遍历还需要 记录当前节点的右子树是否已被遍历 决定是否遍历当前节点 而其广度遍历 只需要一个队列来顺序记录遍历节点 即可轻松解决问题  主要思想在程序代码中来做说明 前序遍历:遍历结果返回一个vector容器中 std::vector<int> BinaryTree::pre_order_iter(Binary_node *root){    std::vector<int> res