二叉树遍历:前序、中序、后序

2024-05-10 11:38

本文主要是介绍二叉树遍历:前序、中序、后序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 二叉树三种遍历的递归、非递归实现

首先定义一棵二叉树的结构:

 

/*** @Description 二叉树* @Author lilong* @Date 2019-02-27 10:23*/
public class BinTreeNode {private int data;private BinTreeNode left;private BinTreeNode right;public int getData() {return data;}public void setData(int data) {this.data = data;}public BinTreeNode getLeft() {return left;}public void setLeft(BinTreeNode left) {this.left = left;}public BinTreeNode getRight() {return right;}public void setRight(BinTreeNode right) {this.right = right;}
}

然后是3种遍历的递归、非递归实现:

 

import java.util.Stack;/*** @Description 前序遍历、中序遍历、后序遍历* @Author lilong* @Date 2019-02-27 11:26*/
public class TraverseBinTree {/* 递归 *//*** 前序遍历(递归)* @param root*/public void preOrderRecursive(BinTreeNode root) {if (root == null) {return;}System.out.println(root.getData());preOrderRecursive(root.getLeft());preOrderRecursive(root.getRight());}/*** 中序遍历(递归)* @param root*/public void inOrderRecursive(BinTreeNode root) {if (root == null) {return;}preOrderRecursive(root.getLeft());System.out.println(root.getData());preOrderRecursive(root.getRight());}/*** 后序遍历(递归)* @param root*/public void postOrderRecursive(BinTreeNode root) {if (root == null) {return;}preOrderRecursive(root.getLeft());preOrderRecursive(root.getRight());System.out.println(root.getData());}/* 非递归 *//*** 前序遍历* @param root*/public void preOrder(BinTreeNode root) {if (root == null) {return;}Stack<BinTreeNode> stack = new Stack<BinTreeNode>();while (true) {while (root != null) {System.out.println(root.getData());stack.push(root);root = root.getLeft();}if (stack.isEmpty()) {break;}root = stack.pop();root = root.getRight();}}/*** 中序遍历* @param root*/public void inOrder(BinTreeNode root) {if (root == null) {return;}Stack<BinTreeNode> stack = new Stack<BinTreeNode>();while (true) {while (root != null) {stack.push(root);root = root.getLeft();}if (stack.isEmpty()) {break;}root = stack.pop();System.out.println(root.getData());root = root.getRight();}}/*** 后序遍历* @param root*/public void postOrder(BinTreeNode root) {if (root == null) {return;}Stack<BinTreeNode> stack = new Stack<BinTreeNode>();while (true) {if (root != null) {stack.push(root);root = root.getLeft();} else {if (stack.isEmpty()) {System.out.println("Stack is empty.");return;} else {if (stack.peek().getRight() == null) {root = stack.pop();System.out.println(root.getData());if (root == stack.peek().getRight()) {System.out.println(stack.peek().getData());stack.pop();}}if (!stack.isEmpty()) {root = stack.peek().getRight();} else {root = null;}}}}}
}

最后测试下:

/*** @Description 测试* @Author lilong* @Date 2019-02-27 11:35*/
public class Test {public static void main(String[] args) {BinTreeNode node1 = new BinTreeNode();node1.setData(2);node1.setLeft(null);node1.setRight(null);BinTreeNode node2 = new BinTreeNode();node2.setData(3);node2.setLeft(null);node2.setRight(null);BinTreeNode root = new BinTreeNode();root.setData(1);root.setLeft(node1);root.setRight(node2);TraverseBinTree traverseBinTree = new TraverseBinTree();
//        traverseBinTree.preOrderRecursive(root);
//        traverseBinTree.inOrderRecursive(root);
//        traverseBinTree.postOrderRecursive(root);
//        traverseBinTree.preOrder(root);
//        traverseBinTree.inOrder(root);traverseBinTree.postOrder(root);}
}

 

2.二叉树经典问题

根据前序遍历、中序遍历推出后序遍历。

前序:A B D E C F

中序:D B E A F C

 

前序遍历最左边的节点是根节点,此处是A,然后在中序遍历中找到A的位置,左边是左子树,右边是右子树。

 

以此类推,得到:

问:是否任意给定两种遍历方式就能得到另一种?

答:不是,这两种方式中必须有一种是中序遍历。

 

扩展:如果不是二叉树,而是一颗普通树,怎么遍历?

 

 

 

这篇关于二叉树遍历:前序、中序、后序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/976335

相关文章

剑指offer(C++)--平衡二叉树

题目 输入一棵二叉树,判断该二叉树是否是平衡二叉树。 class Solution {public:bool IsBalanced_Solution(TreeNode* pRoot) {if(pRoot==NULL)return true;int left_depth = getdepth(pRoot->left);int right_depth = getdepth(pRoot->rig

二叉树三种遍历方式及其实现

一、基本概念 每个结点最多有两棵子树,左子树和右子树,次序不可以颠倒。 性质: 1、非空二叉树的第n层上至多有2^(n-1)个元素。 2、深度为h的二叉树至多有2^h-1个结点。 3、对任何一棵二叉树T,如果其终端结点数(即叶子结点数)为n0,度为2的结点数为n2,则n0 = n2 + 1。 满二叉树:所有终端都在同一层次,且非终端结点的度数为2。 在满二叉树中若其深度为h,则其所包含

LeetCode 算法:二叉树的中序遍历 c++

原题链接🔗:二叉树的中序遍历 难度:简单⭐️ 题目 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 输入:root = [1,null,2,3] 输出:[1,3,2] 示例 2: 输入:root = [] 输出:[] 示例 3: 输入:root = [1] 输出:[1] 提示: 树中节点数目在范围 [0, 100] 内 -100 <= Node.

C++ 重建二叉树(递归方法)

/*** struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* };*/#include <vector>class Solution {public:/*** 代码

数据结构:二叉树详解 c++信息学奥赛基础知识讲解

目录 一、二叉树的定义 二、二叉树的形态 三、二叉树的性质 四、二叉树的存储 五、二叉树的创建与遍历(递归) 六、二叉树实现 创建二叉树 展示二叉树 1、计算数的高度 2、计算数的叶子数量 3、计算数的宽度 4、层次遍历 5、前序遍历 递归写法 非递归写法 6、中序遍历 递归写法 非递归写法 7、后序遍历 递归写法 非递归写法 8、输出根节点到所有叶

秋招突击——6/22——复习{区间DP——加分二叉树,背包问题——买书}——新作{移除元素、实现strStr()}

文章目录 引言复习区间DP——加分二叉树个人实现 背包问题——买书个人实现参考实现 新作移除元素个人实现参考思路 找出字符串中第一个匹配项的下标个人实现参考实现 总结 引言 今天做了一个噩梦,然后流了一身汗,然后没起来,九点多才起床背书。十点钟才开始把昨天那道题题目过一遍,然后十一点才开始复习题目,为了不耽误下午的时间,所以这里的就单纯做已经做过的题目,主打一个有量,不在学

leetcode刷题(46)——236. 二叉树的最近公共祖先

这道题比235略难一些 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4] 示例 1: 输入:

leetcode刷题(97)——106. 从中序与后序遍历序列构造二叉树

根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 中序遍历 inorder = [9,3,15,20,7]后序遍历 postorder = [9,15,7,20,3] 返回如下的二叉树: 3/ \9 20/ \15 7 看下后序和中序遍历的框架: void traverse(TreeNode root) {trave

leetcode刷题(97)——105. 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7 1.先回顾前序遍历和中序遍历的框架: void traverse(TreeNode root) {//

【算法】二叉树 - 理论基础

1.种类 1.1 满二叉树 只有度为0和2的节点,且度为0的节点都都在同一层。深度为k,有2^k-1个节点。 1.2 完全二叉树 在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层(h从1开始),则该层包含 1~ 2^(h-1) 个节点。 1.2 二叉树搜索树 有数值的有序树 若它的左