对于二叉树的遍历是指按某种规律依次访问二叉树的每个节点,其过程就是将非线性结构的二叉树节点排列成一个线性序列的一个过程。
遍历二叉树(对于以链表形式来存储的): 1.深度优先遍历 : 先访问书中最深层次的节点。分为前序 后序 中序排序三种方式。
前(先)序:根,左子树, 右子树。
中序:左子树, 根, 右子树。
后序:左子树,右子树, 根。
注意:对于一个节点来说,在子树中,它可能就是根节点,但是他又是其父节点的孩子。明白这样的双重性下面就好理解了。如图:
2.广度优先遍历:逐层访问 , 先访问完第一层的节点, 在访问第二层, 依次进行下去 ......故而又叫按层遍历。
参考代码:
先序部分:
public List<TreeNode> preOrder(){
return preOrder(root);
}
public List<TreeNode> preOrder(TreeNode node){
List<TreeNode> list = new ArrayList<TreeNode>();
list.add(node);
if(node.left != null){
list.addAll(preOrder(node.left));
}
if(node.right != null){
list.addAll(preOrder(node.right));
}
return list;
}
中序部分:
//中序
public List<TreeNode> inOrder(){
return inOrder(root);
}
public List<TreeNode> inOrder(TreeNode node){
List<TreeNode> list = new ArrayList<TreeNode>();
if(node.left != null){
list.addAll(inOrder(node.left));
}
list.add(node);
if(node.right != null){
list.addAll(inOrder(node.right));
}
return list;
}
后序部分:
//后序
public List<TreeNode> postOrder(){
return postOrder(root);
}
public List<TreeNode> postOrder(TreeNode node){
List<TreeNode> list = new ArrayList<TreeNode>();
if(node.left != null){
list.addAll(postOrder(node.left));
}
if(node.right != null){
list.addAll(postOrder(node.right));
}
list.add(node);
return list;
}
广度优先排序部分:
先把根节点放入队列中,从队列中弹出一个节点(第一次就是根节点),然后把该节点的左右子树压入队列中,若无子节点,则说明是叶子节点了。循环知道队列为空,说明所有的叶子节点都经过了队列,便是完成了遍历。
//广度优先排序 按照顺序的存储,先进来的是不是先出去 所以需要使用有“FIFO”的特征的队列queue来帮助实现
public List<TreeNode> breadFirst(){
Queue<TreeNode> queue = new ArrayDeque<TreeNode>();
List<TreeNode> list = new ArrayList<TreeNode>();
if(root != null){
//将根元素压入队列之中
queue.offer(root);
}
while(!queue.isEmpty()){
//将“队尾”的数据加入到list中去
list.add(queue.peek());
TreeNode p = queue.poll();
//如果左节点不是null 也将它加入到队列中去
if(p.left != null){
queue.offer(p.left);
}
if(p.right != null){
queue.offer(p.right);
}
}
return list;
}
TreeNode类中需要再添加(否则list返回的是地址码):
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public String toString(){
return (String)this.getData();
}
构建二叉树是利用的链表结构,可参看:点击打开链接。
结果截图:
参考:
《疯狂java 突破程序员基本功的16课》
以上就是这篇的内容了,如果您有什么觉得改进的地方或者发现了错误的部分,请指教。谢谢!