二叉树的前序遍历
递归法
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> result=new ArrayList<>();
traversal(root,result);
return result;
}
public void traversal(TreeNode root,List<Integer> list){
if(root==null)
return;
list.add(root.val); //中
traversal(root.left,list); //左
traversal(root.right,list); //右
}
迭代法
使用栈解决
public List<Integer> preorderTraversal2(TreeNode root) {
Stack<TreeNode> stack=new Stack<TreeNode>();
List<Integer> result= new ArrayList<>();
//结点入栈
stack.push(root);
while (!stack.isEmpty()){
TreeNode node=stack.pop();
if(node!=null) {
result.add(node.val); //中
}else continue;
//栈时先进后出,所以压入右结点
if(node.right!=null){
stack.push(node.right);
}
//再压入左结点
if(node.left!=null){
stack.push(node.left);
}
}
return result;
}
二叉树的中序遍历
递归法
//递归法
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> result=new ArrayList<>();
traversal(root,result);
return result;
}
public void traversal(TreeNode root,List<Integer> list){
if(root==null)
return;
traversal(root.left,list); //左
list.add(root.val); //中
traversal(root.right,list); //右
}
迭代法
使用一个pointer来访问结点,遍历到最左边,再使用栈来处理。
//迭代法
public List<Integer> inorderTraversal(TreeNode root) {
Stack<TreeNode> stack=new Stack<TreeNode>();
List<Integer> result= new ArrayList<>();
//用来访问节点
TreeNode pointer=new TreeNode();
pointer=root;
while(pointer!=null||!stack.isEmpty()){
//访问到最左边的节点,依次将访问节点压入栈
if(pointer!=null){
stack.push(pointer);
pointer=pointer.left; //左
}
//访问到最左边节点后,开始处理节点
else
{
pointer=stack.pop();
result.add(pointer.val); //中
pointer=pointer.right; //右
}
}
return result;
}
二叉树的后序遍历
递归法
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> result=new ArrayList<>();
traversal(root,result);
return result;
}
public void traversal(TreeNode root,List<Integer> list){
if(root==null)
return;
traversal(root.left,list); //左
traversal(root.right,list); //右
list.add(root.val); //中
}
迭代法
前序遍历是中左右,后序是左右中,所以可调整前序代码为中右左,然后在反转就是左右中了。
//迭代法
public List<Integer> postorderTraversal2(TreeNode root) {
Stack<TreeNode> stack=new Stack<TreeNode>();
List<Integer> result= new ArrayList<>();
//结点入栈
stack.push(root);
while (!stack.isEmpty()){
TreeNode node=stack.pop();
if(node!=null) {
result.add(node.val); //中
}else continue;
if(node.left!=null){
stack.push(node.left); //左
}
if(node.right!=null){
stack.push(node.right); //右
}
}
//反转
Collections.reverse(result);
return result;
}