//后序遍历
public static void postOrder(TreeNode root){
if(root==null){
return;
}
preOrder(root.left);
preOrder(root.right);
System.out.print(root.val+" ");
}
2.6.2?二叉树的遍历 (迭代)
1.前序遍历
//方法2(迭代)
//先序遍历 (迭代)
public static void preOrderNonRecursion(TreeNode root){
if(root==null){
return ;
}
Deque<TreeNode> stack=new LinkedList<>();
stack.push(root);
while (!stack.isEmpty()){
TreeNode cur=stack.pop();
System.out.print(cur.val+" ");
if(cur.right!=null){
stack.push(cur.right);
}
if(cur.left!=null){
stack.push(cur.left);
}
}
}
2.中序遍历
//方法2(迭代)
//中序遍历 (迭代)
public static void inorderTraversalNonRecursion(TreeNode root) {
if(root==null){
return ;
}
Deque<TreeNode> stack=new LinkedList<>();
// 当前走到的节点
TreeNode cur=root;
while (!stack.isEmpty() || cur!=null){
// 不管三七二十一,先一路向左走到根儿~
while (cur!=null){
stack.push(cur);
cur=cur.left;
}
// 此时cur为空,说明走到了null,此时栈顶就存放了左树为空的节点
cur=stack.pop();
System.out.print(cur.val+" ");
// 继续访问右子树
cur=cur.right;
}
}
3.后序遍历
//方法2(迭代)
//后序遍历 (迭代)
public static void postOrderNonRecursion(TreeNode root){
if(root==null){
return;
}
Deque<TreeNode> stack=new LinkedList<>();
TreeNode cur=root;
TreeNode prev=null;
while (!stack.isEmpty() || cur!=null){
while (cur!=null){
stack.push(cur);
cur=cur.left;
}
cur=stack.pop();
if(cur.right==null || prev==cur.right){
System.out.print(cur.val+" ");
prev=cur;
cur=null;
}else {
stack.push(cur);
cur=cur.right;
}
}
}
2.6.3?二叉树的基本操作
1.求结点个数(递归&迭代)
//方法1(递归)
//传入一颗二叉树的根节点,就能统计出当前二叉树中一共有多少个节点,返回节点数
//此时的访问就不再是输出节点值,而是计数器 + 1操作
public static int getNodes(TreeNode root){
if(root==null){
return 0;
}
return 1+getNodes(root.left)+getNodes(root.right);
}
//方法2(迭代)
//使用层序遍历来统计当前树中的节点个数
public static int getNodesNoRecursion(TreeNode root){
if(root==null){
return 0;
}
int size=0;
Deque<TreeNode> queue=new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
TreeNode cur = queue.poll();
size++;
if (cur.left != null) {
queue.offer(cur.left);
}
if (cur.right != null) {
queue.offer(cur.right);
}
}
return size;
}
2.求叶子结点个数(递归&迭代)
//方法1(递归)
//传入一颗二叉树的根节点,就能统计出当前二叉树的叶子结点个数
public static int getLeafNodes(TreeNode root){
if(root==null){
return 0;
}
if(root.left==null && root.right==null){
return 1;
}
return getLeafNodes(root.left)+getLeafNodes(root.right);
}
//方法2(迭代)
//使用层序遍历来统计叶子结点的个数
public static int getLeafNodesNoRecursion(TreeNode root){
if(root==null){
return 0;
}
int size=0;
Deque<TreeNode> queue=new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()){
TreeNode cur=queue.poll();
if(cur.left==null && cur.right==null){
size++;
}
if(cur.left!=null){
queue.offer(cur.left);
}
if(cur.right!=null){
queue.offer(cur.right);
}
}
return size;
}
3.求第 k 层结点个数
//求出以root为根节点的二叉树第k层的节点个数
public static int getKLevelNodes(TreeNode root,int k){
if(root==null || k<=0){
return 0;
}
if(k==1){
return 1;
}
return getKLevelNodes(root.left,k-1)+getKLevelNodes(root.right,k-1);
}
4.求树的高度
//传入一个以root为根节点的二叉树,就能求出该树的高度
public static int height(TreeNode root){
if(root==null){
return 0;
}
return 1+ Math.max(height(root.left),height(root.right));
}
5.判断二叉树数中是否存在值为value的节点
//判断当前以root为根节点的二叉树中是否包含指定元素val,
//若存在返回true,不存在返回false
public static boolean contains(TreeNode root,char value){
if(root==null){
return false;
}
if(root.val==value){
return true;
}
return contains(root.left,value) || contains(root.right,value);
}
2.7?二叉树的层序遍历
//层序遍历
public static void levelOrder(TreeNode root) {
if(root==null){
return ;
}
// 借助队列来实现遍历过程
Deque<TreeNode> queue =new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()){
int size=queue.size();
for (int i = 0; i < size; i++) {
TreeNode cur=queue.poll();
System.out.print(cur.val+" ");
if(cur.left!=null){
queue.offer(cur.left);
}
if(cur.right!=null){
queue.offer(cur.right);
}
}
}
}
3.二叉树完整代码
二叉树完整代码见下节:《Java 二叉树完整代码(递归&迭代)》???????