二叉树
二叉树的定义
首先我们准备一颗二叉树:
我们需要定义一些术语,我们所使用的数据结构由结点组成,结点包含的链接可以为空也可以指向其他结点. 在二叉树中,每个结点只能有一个父节点(只有一个例外,也就是根节点,它没有父节点),而且每个结点只有两个链接, 分别指向自己的左子结点和右子结点.尽管链接指向的是结点,但我们可以将每个链接看做指向了另一颗二叉树, 而这棵树的根节点就是被指向的节点.因此,我们可以将二叉树定义为一个空链接 ,或者是一个有左右两个链接的结点,每个链接都指向一颗(独立的)二叉树。----《算法》第四版。
前中后序遍历(这是本篇文章的要讨论的核心问题之一,由前中后序遍历来讨论递归,然后再到荷兰国旗问题和快速排序) 结点代码:
public class TreeNode {
int data;
TreeNode leftNode;
TreeNode rightNode;
public TreeNode(int data) {
this.data = data;
}
}
二叉树:
public class BinaryTree {
TreeNode root;
public BinaryTree(TreeNode root) {
this.root = root;
}
/**
* 前序遍历
*/
public void frontShow(){
}
/**
* 中序遍历
*/
public void middleShow(){
}
/**
* 后序遍历
*/
public void afterShow(){
}
}
虽然百度不招人喜欢,但是百度百科的一些词条编辑的还是不错的. 从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部分组成。因此,在任一给定结点上,可以按某种次序执行三个操作:
(1) 访问结点本身(N), (2) 遍历该结点的左子树(L), (3) 遍历该结点的右子树(R)。
前序遍历: 根节点 左子树 右子树 中序遍历: 左子树 根节点 右子树 后序遍历: 左子树 右子树 根节点
其实组合的话是有六种的,但是讨论递归的话,前中后序就足够了.
我们现在来任意的给一颗二叉树,不用代码。我们来写出前中后序遍历的结果:
前序遍历: 3 8 5 2 6 1 7 中序遍历: 5 8 2 3 1 6 7 后序遍历: 5 2 8 1 7 6 3
前中后序遍历的进一步解释: 当我到达一个结点,先打印出来,再去访问其他子结点就是前序遍历 当我到达一个结点,不是先打印当前结点,而是接着访问该节点的左子节点,某个节点没有子节点(或者说子结点是null) 我就打印当前节点,这就是中序遍历
以前序遍历为例,我首先打印根节点,然后判断它的左子节点是否为空,如果非空,打印该节点,然后接着进行这样的操作,
翻译成代码就是这样的:
在BinaryTree中的代码:
public void frontShow(){
System.out.println(root.data);
if (root.leftNode != null){
root.leftNode.frontShow();
}
if (root.rightNode != null){
root.rightNode.frontShow();
}
}
结点中的代码也是这样的,
public void frontShow(){
System.out.println(root.data);
if (root.leftNode != null){
root.leftNode.frontShow();
}
if (root.rightNode != null){
root.rightNode.frontShow();
}
}
中后序代码把打印顺序调整一下就可以了,其实这个很好理解,不是多么酷炫的事情. 以下一个问题在我个人看来才是值得值得思考的,就是程序在遍历二叉树的过程,每个节点经过了几次。 其实这个问题,也是十分简单,你按着程序走就可以了.
首先来到3,接着来到8,接着来到5,然后发现5的左右子节点都是空的,然后回到…
这里再介绍另一种在形式上略有不同的前序遍历方式:
public void frontShow(TreeNode root){
if (root == null){
return;
}
System.out.println(data);
frontShow(root.leftNode);
frontShow(root.rightNode);
}
最后
以上全部分布式技术专题+面试解析+相关的手写和学习的笔记pdf
CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】
还有更多Java笔记分享如下:
面试解析+相关的手写和学习的笔记pdf
CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】
还有更多Java笔记分享如下: