二叉树操作总结

  对于二叉树,有前序、中序、后序三种遍历方法,由于树的定义本身就是递归定义的,故采用递归方法实现三种遍历简洁易懂。若采用非递归访问,则需要使用栈来模拟递归的实现。三种遍历的非递归算法中,前序和后序较容易,而后序相对较难。

  前序遍历 递归 非递归
树的遍历 中序遍历 递归 非递归
后序遍历 递归 非递归
  层次遍历    
计算树高      
 计算结点数      
  1. 前序遍历【访问顺序:根结点-左孩子-右孩子】

    a> 前序遍历递归实现

1 void PreOrderRecursively(BinaryTreeNode *root)
2 {//递归前序遍历[根,左,右]
3     if(root != NULL)
4     {
5         cout << root->data <<" ";
6         PreOrderRecursively(root->pLeft);
7         PreOrderRecursively(root->pRight);
8     }
9 }

    b> 前序遍历非递归实现

 1 void PreOrder(BinaryTreeNode *root)
 2 {//非递归前序遍历:借助于栈,先将根入栈,只要栈不为空,就弹出一个结点,同时将其右孩子、左孩子入栈。
 3  //                   注意:右子树先入栈,以保证右子树在栈中处于左子树的下面[栈:后进先出]
 4     if(root == NULL)
 5         return;
 6     stack<BinaryTreeNode*> s;
 7     s.push(root);//根入栈
 8
 9     BinaryTreeNode *temp;
10     while(!s.empty())//栈不为空
11     {
12         temp = s.top();//访问栈顶结点
13         cout << temp->data<<" ";
14         s.pop();//出栈
15         if(temp->pRight)
16             s.push(temp->pRight);
17         if(temp->pLeft)
18             s.push(temp->pLeft);
19     }
20 }

参考:http://blog.csdn.net/xiajun07061225/article/details/12760627

     http://blog.csdn.net/hackbuteer1/article/details/6583988

时间: 2024-10-26 19:26:33

二叉树操作总结的相关文章

二叉树操作复习

2017-08-29 11:46:37 writer:pprp 已经写了二叉树好几次了,但是还是有很多细节没有考虑完全 还有好多东西都没有考虑到,以后还是要写这个代码,把应该考虑的细节都考虑清楚 代码及讲解如下:(都测试过了,应该没问题,如果有问题请留言) /* @theme:树的建立和遍历 @writer:pprp @start:10:00 @end:11:47 @declare:我建立的这个树好像跟教科书上的树方向反了一下, 但是不影响理解,教科书上的是大的在右边,小的在左边,我的恰好反了过

POJ 1577 Falling Leaves 二叉树操作

Description Figure 1 Figure 1 shows a graphical representation of a binary tree of letters. People familiar with binary trees can skip over the definitions of a binary tree of letters, leaves of a binary tree, and a binary search tree of letters, and

二叉树操作

问题0:      二叉树的非递归遍历方法 问题1: 判断一颗二叉树是否为二叉查找树. 问题2: 判断两个二叉树是否相同 问题3:      判断一棵树是否为平衡树 问题4:      寻找二叉树的最大和最短简单路径长度 问题5:      二叉树上简单路径的长度问题 解答0: [0.1]前序.使用栈,访问节点后先压入右儿子,再压入左儿子即可. 1 vector<int> preorderTraversal(TreeNode *root){ 2 stack<TreeNode*> s

【c语言】数据结构(二叉树操作)

  1 #include<stdio.h> 2 #include<stdlib.h> 3 typedef struct BITree{ 4 char data; 5 BITree *lchild; 6 BITree *rchild; 7 }BITree,*BiTree; 8 typedef struct Queue{ 9 BiTree data; 10 Queue *next; 11 }Queue; 12 BITree *pop(Queue *p) 13 { 14 Queue *q

c语言(二叉树的操作)

#include "stdio.h" #include "malloc.h" #include "stdlib.h" typedef struct BTNode { int data; struct BTNode *Lchild,*Rchild; }BTree; //初始化 BTree * Ini_BTNode() { BTree *bt ; int a; bt=(BTree *)malloc(sizeof(BTree)); printf(&qu

二叉树的基本运算

//二叉树的初始化操作.二叉树的初始化需要将指向二叉树的根结点指针置为空: void InitBitTree(BiTree *T)//二叉树的初始化操作 { *T=NULL; } //二叉树的销毁操作.如果二叉树存在,将二叉树存储空间释放: void DestroyBitTree(BiTree *T)//销毁二叉树操作 { if(*T)//如果是非空二叉树 { if((*T)->lchild) DestroyBitTree(&((*T)->lchild)); if((*T)->r

NOJ1019-计算二叉树的高度和结点数

输入 二叉树的先序遍历序列,用#代表空树或空子树. 输出 共五行 前三行依次输出先序.中序和后序遍历序列, 第四行输出二叉树的高度, 第五行依次输出二叉树总结点数目.叶子结点数目.度为1的结点数目. 样例输入 A B # D # # C E # # F # # 样例输出 PreOrder: A B D C E FInOrder: B D A E C FPostOrder: D B E F C A36 3 1 题目很简单,基本的二叉树操作.需要注意的是输入结点之间有空格,而且输出结点时也有空格,行

【转载】二叉树的基本概念和实现

原文:二叉树的基本概念和实现 继续是<数据结构算法与应用:C++语言描述>的笔记,这是第八章二叉树和其他树的内容,本节内容介绍树的定义以及二叉树的代码实现. 树 树t是一个非空的有限元素的集合,其中一个元素为根,余下的元素组成t的子树. 在画一棵树时,每个元素都代表一个节点.树根在上面,其子树画在下面.如下图所示,其中,Ann,Mary,John是Joe的 孩子(children) ,而Joe是他们的 父母(parent).有相同父母的孩子是 兄弟(sibling) .Ann,Mary,Joh

_DataStructure_C_Impl:二叉树的二叉链表存储结构

// _DataStructure_C_Impl: #include<stdio.h> #include<stdlib.h> #define MaxSize 100 typedef char DataType; typedef struct Node{ //二叉链表存储结构类型定义 DataType data; //数据域 struct Node *lchild; //指向左孩子结点 struct Node *rchild; //指向右孩子结点 }*BiTree,BitNode;