(一)二叉搜索树的遍历
- 二叉树如图
先序遍历
-
访问顺序:
- 根节点、前序遍历左子树,前序遍历右子树
- 7、4、2、1、3、5、9、8、11、10、12
-
递归遍历代码:
public void preorderTraversal() { preorderTraversal(root); } public void preorderTraversal(Node<E> node){ if (node == null ) return; System.out.println(node.element); preorderTraversal(node.left); preorderTraversal(node.right); }
中序遍历
- 访问顺序
- 先中序遍历左子树、根节点、在中序遍历右子树
- 1、2、3、4、5、7、8、9、10、11、12
public void middleOrderTraversal(){
middleOrderTraversal(root);
}
public void middleOrderTraversal(Node<E> node){
if (node == null ) return;
middleOrderTraversal(node.left);
System.out.println(node.element);
middleOrderTraversal(node.right);
}
后序遍历
- 访问顺序:
- 先后序遍历左子树、在后序遍历右子树、根节点。
- 1、3、2、5、4、8、10、12、11、9、7
public void postOrderTraversal(){
postOrderTraversal(root);
}
public void postOrderTraversal(Node<E> node){
if (node == null ) return;
postOrderTraversal(node.left);
postOrderTraversal(node.right);
System.out.println(node.element);
}
层序遍历
- 访问顺序:
- 从上到下,从左到右依次访问每一个结点
- 7、4、9、2、5、8、11、1、3、10、12
-
实现思路:使用队列
1、将根节点入队
2、循环执行一下操作、直到队列为空。
-
将队头节点A出队,进行访问
-
将A的左子节点入队
-
将A的右子节点入队
-
//层次遍历
public void levelOrderTraversal(){
if (root == null) return;
Queue<Node<E>> queue = new LinkedList<>();
queue.offer(root);//根节点入队
while(!queue.isEmpty()){
Node<E> node = queue.poll();
System.out.println(node.element);//输出节点元素
if ( node.left != null ){
queue.offer(node.left);
}
if ( node.right != null ){
queue.offer(node.right);
}
}
}
(二)求二叉树的高度
方法一:递归遍历
比较左右子树的高度,谁的高度高,则树的高度则为:1+子数高度较高的;
public int height(){
return height(root);
}
public int height(Node<E> node){
if (node == null) return 0;
return 1 + Math.max(height(node.left),height(node.right));
}
方法二:非递归
- 采用层次遍历
public int getTreeHeight(){
if (root == null ) return 0;
Queue<Node<E>> queue = new LinkedList();
queue.offer(root);
int levelNum = 1; //存取层的节点树
int height = 0;
while(!queue.isEmpty()){
Node<E> node = queue.poll();//出队
levelNum--;//有多少个节点就遍历多少次
if (node.left != null){
queue.offer(node.left);
}
if (node.right != null){
queue.offer(node.right);
}
//levelNum默认为1(只要根节点不为空,高度自然从1开始)
//每回遍历完一层,queue的大小为下一层节点的数目
if (levelNum == 0){
levelNum = queue.size();
height++;
}
}
return height;
}
验证: