一、二叉树的先序遍历
二叉树的先序遍历,递归实现和非递归实现。
递归实现代码如下(示例):
public void preOrder(TreeNode root){
if(root!=null) list.add(root.val);
if(root.left!=null) preOrder(root.left);
if(root.right!=null) preOrder(root.right);
}
非递归实现代码如下(示例):
public void preOrder(TreeNode root){
Stack<TreeNode> stack=new Stack();
TreeNode p=root;
while(p!=null||!stack.isEmpty()){
if(p!=null){
list.add(p.val);
stack.push(p);
p=p.left;
}else{
p=stack.pop();
p=p.right;
}
}
}
三、二叉树的中序遍历
递归实现代码如下(示例):
public void preOrder(TreeNode root){
if(root.left!=null) preOrder(root.left);
if(root!=null) list.add(root.val);
if(root.right!=null) preorder(root.right);
}
递归实现代码如下(示例):
public void preOrder(TreeNode root){
Stack<TreeNode> stack=new Stack();
TreeNode p=root;
while(p!=null||!stack.isEmpty()){
if(p!=null){
stack.push(p);
p=p.left;
}else{
p=stack.pop();
list.add(p.val);
p=p.right;
}
}
}
三、二叉树的后序遍历
递归实现代码如下(示例):
public void preOrder(TreeNode root){
if(root.left!=null) preOrder(root.left);
if(root.right!=null) preorder(root.right);
if(root!=null) list.add(root.val);
}
递归实现代码如下(示例):
public void preOrder(TreeNode root){
Stack<TreeNode> stack=new Stack();
TreeNode p=root,r=null;
while(p!=null||!stack.isEmpty()){
if(p!=null){
stack.push(p);
p=p.left;
}else{
p=stack.pop();
if(p.right!=null&&p.right!=r){
p=p.right;
stack.push(p);
p=p.left;
}else{
p=stack.pop();
list.add(p.val);
r=p;
p=null;
}
}
}
}
三、二叉树的层次遍历
代码如下(示例):
class Solution {
public List<List<Integer>> biglist=new ArrayList<>();
public List<List<Integer>> levelOrderBottom(TreeNode root) {
if(root==null) return biglist;
order(root,0);
Collections.reverse(biglist);
return biglist;
}
void order(TreeNode root,int level){
if(biglist.size()==level){
biglist.add(new ArrayList<>());
}
biglist.get(level).add(root.val);
if(root.left!=null){
order(root.left,level+1);
}
if(root.right!=null){
order(root.right,level+1);
}
}
}
四、广度优先遍历
代码如下(示例):
public int maxDepth(TreeNode root){
if(root==null) return 0;
Stack<TreeNode> stack=new Stack<>();
Stack<Integer> value=new Stack<>();
stack.push(root);
while(!stack.isEmpty()){
TreeNode node=stack.pop();
if(node.left!=null){
stack.push(node.left);}
if(node.right!=null){
stack.push(node.right);
}
list.add(node.val);
}
}
四、深度优先遍历
代码如下(示例):
public class Solution {
public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
ArrayList<Integer> lists=new ArrayList<Integer>();
if(root==null)
return lists;
Stack<TreeNode> stack=new Stack<TreeNode>();
stack.push(root);
while(!stack.isEmpty()){
TreeNode tree=stack.pop();
//先往栈中压入右节点,再压左节点,这样出栈就是先左节点后右节点了。
if(tree.right!=null)
stack.push(tree.right);
if(tree.left!=null)
stack.push(tree.left);
lists.add(tree.val);
}
return lists;
}
}