1.二叉树前中后序遍历非递归实现
public void preOrderUnRecur(TreeNode root){
if(root==null) return;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while (!stack.isEmpty()){
TreeNode node = stack.pop();
System.out.println(node.val);
if(node.right!=null){
stack.push(node.right);
}
if(node.left!=null){
stack.push(node.left);
}
}
}
public void InOrderUnRecur(TreeNode root){
if(root==null) return;
Stack<TreeNode> stack1 = new Stack<>();
TreeNode node = root;
while (!stack1.isEmpty() || node!=null){
if (node!=null){
stack1.push(node);
node = node.left;
}else {
node = stack1.pop();
System.out.println(node.val);
node = node.right;
}
}
}
public void LastOrderUnRecur(TreeNode root){
if(root==null) return;
Stack<TreeNode> stack1 = new Stack<>();
Stack<TreeNode> stack2 = new Stack<>();
stack1.push(root);
while (!stack1.isEmpty()){
TreeNode node = stack1.pop();
stack2.push(node);
if(node.left!=null){
stack1.push(node.left);
}
if(node.right!=null){
stack1.push(node.right);;
}
}
while (!stack2.isEmpty()){
System.out.println(stack2.pop().val);
}
}
2.二叉树层序遍历
public void levelOrder(TreeNode root){
if(root==null) return;
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()){
TreeNode node = queue.poll();
System.out.println(node.val);
if(node.left!=null){
queue.add(node.left);
}
if(node.right!=null){
queue.add(node.right);
}
}
}
3.求二叉树最大宽度
public int maxLevelNode(TreeNode root){
if(root==null) return -1;
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
int max = Integer.MIN_VALUE;
int curLevelNodes = 0;
int curLevel = 1;
HashMap<TreeNode, Integer> map = new HashMap<>();
map.put(root,curLevel);
while (!queue.isEmpty()){
TreeNode node = queue.poll();
if(map.get(node)==curLevel){
curLevelNodes++;
}else {
max = Math.max(curLevelNodes,max);
curLevelNodes = 1;
curLevel++;
}
if(node.left!=null){
queue.add(node.left);
map.put(node.left,curLevel+1);
}
if(node.right!=null){
queue.add(node.right);
map.put(node.right,curLevel+1);
}
}
return Math.max(max,curLevelNodes);
}