定义节点
class ListNode{
ListNode left;
ListNode right;
int val;
public ListNode(int value){
this.val=value;
}
}
实现深度优先遍历
这里其实有三种前序中序后序,而且可以使用递归和非递归的方法。
递归的话在深度遍历一般需要用栈。
public void dfs(ListNode node){
if(node==null){
System.out.print("empty tree");
return;
}
Stack<ListNode> stack = new Stack<ListNode>();
stack.push(node);
//用循环的方式来,当stack不为空就一直进行下去
while(!stack.isEmpty()){
ListNode rnode = stack.pop();
System.out.print(rnode.val);
if(rnode.right!=null){
stack.push(rnode.right);
}
if(rnode.left!=null){
stack.push(rnode.left);
}
}
}
而对于广度优先搜索
需要用到双向队列deque
public void dfs(LsitNode node){
if(node==null){
System.out.print("empty tree");
return;
}
ArrayDeque<ListNode> deque = new ArrayDeque<ListNode>();
deque.add(node);
while(!deque.isEmpty()){
//remove() and add()
ListNode rnode = deque.remove();
System.out.print(rnode.val+" ");
if(rnode.left!=null){
deque.add(rnode.left);
}
if(rnode.right!=null){
deque.add(rnode.right);
}
}
}
问题:LeetCode的题,给一个二叉树的根节点root,返回它的中序遍历List
输入:root = [1,null,2,3]
输出:[1,3,2]
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
解答:
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
// List用add,remove。而stack用pop,push
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
while(!stack.isEmpty() ||cur != null){
if(cur != null){
stack.push(cur);
cur = cur.left;
}else{
cur = stack.pop();
list.add(cur.val);
cur = cur.right;
}
}
return list;
}
}