今天写了一下树的遍历,树的遍历有深度搜索和广度搜索
深度搜索 一条路走到黑,直到走完一条完整的分支,然后回溯遍历下一个分支
广度搜索在树中也可以叫做层次遍历,即每次遍历树种的一层,每次可以从左往右遍历,也可以从右往左遍历
题目:
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).
For example:
Given binary tree [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
return its level order traversal as:
[
[3],
[9,20],
[15,7]
]
思路
使用深度搜索: 每次进行递归搜索节点的子孙节点时,传递当前的层数,然后根据相应的层数将遍历到的节点存带相应额链表或者是数组中
使用广度搜索:每遍历一层节点时,有一个kcount记录当前层的剩余节点个数,kcount记录下一层的节点个数,没遍历完一层,则重新建立一个链表,存放下一层的数据
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
//广搜的思想 使用队列实现层次遍历
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> ll = new ArrayList<List<Integer>>();
if(root == null){
return ll;
}
List<Integer> l = new ArrayList<Integer>();
Queue<TreeNode> q = new LinkedList<TreeNode>();
int pcount=0,kcount=0;
q.offer(root);
pcount = 1;
while( q.peek()!=null ){
if(pcount<=0){
ll.add(l);
l = new ArrayList<Integer>();
pcount = kcount;
kcount = 0;
}
TreeNode t = q.poll();
pcount--;
l.add(t.val);
if(t.left!=null){
q.offer(t.left);
kcount++;
}
if(t.right!=null){
q.offer(t.right);
kcount++;
}
}
ll.add(l);
return ll;
}
}