樹的層次遍歷(求樹的深度、寬度、之字形打印二叉樹等等)

對刷題過程中的牽扯到樹的層次遍歷的代碼總結。

1. 基礎版,樹的層次遍歷java代碼的實現(利用的是隊列):

/**
 * Definition for binary tree with next pointer.
 * public class TreeLinkNode {
 *     int val;
 *     TreeLinkNode left, right, next;
 *     TreeLinkNode(int x) { val = x; }
 * }
 */
import java.util.LinkedList;
import java.util.Queue;
public class Solution {
    public void leveltravse(TreeLinkNode root) {
        if(root == null){
            System.out.println("該樹爲空");
        }
        if(root!=null){
            Queue<TreeLinkNode> q = new ArrayList<>();
            TreeLinkNode temp = null;
            q.offer(root);
            while(q.size()!=0){
                temp = q.poll();
                System.out.printl(temp.val);
                if(temp.left!=null){
                    q.offer(temp.left);
                }
                if(temp.right!=null){
                    q.offer(temp.right);
                }
            }
        }
    }
}

2. 求樹的深度,利用樹的層次遍歷的思想,java代碼實現:

import java.util.ArrayList;

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
import java.util.LinkedList;
import java.util.Queue;
public class Solution {
    public int Print(TreeNode pRoot) {
        Queue<TreeNode> q = new LinkedList<>();
        TreeNode temp = null;
        if(pRoot==null)
          return 0;
        int front = -1;
        int rear = -1;
        int last=0;
        int level=0;    //記錄層數
        q.offer(pRoot);
        rear++;
        while(q.size()!=0){
            temp = q.poll();
            front++;
            list.add(temp.val);
            if(temp.left!=null){
                q.offer(temp.left);
                rear++;
            }
            if(temp.right!=null){
                q.offer(temp.right);
                rear++;
            }
            if(front==last){
                level++;
                last=rear;
            }
        }
        return level;
    }

}

3. 之字形打印二叉樹,同樣利用的還是層次遍歷的思想,只需要做一些小小的修改:

import java.util.ArrayList;

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
import java.util.LinkedList;
import java.util.Queue;
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
    public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        ArrayList<Integer> list = new ArrayList<>();
        ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
        Queue<TreeNode> q = new LinkedList<>();
        Stack<Integer> stack = new Stack<>();
        TreeNode temp = null;
        if(pRoot==null)
          return result;
        int front = -1;
        int rear = -1;
        int last=0;
        int level=0; 
        q.offer(pRoot);
        rear++;
        while(q.size()!=0){
            temp = q.poll();
            front++;
            list.add(temp.val);
            if(temp.left!=null){
                q.offer(temp.left);
                rear++;
            }
            if(temp.right!=null){
                q.offer(temp.right);
                rear++;
            }
            if(front==last){
                level++;
                last=rear;
                if(level%2==0){
                    for(int i=0;i<list.size();i++)
                        stack.push(list.get(i));
                    list = new ArrayList<>();
                    while(!stack.isEmpty()){
                        
                        list.add(stack.pop());
                    }
                }
                result.add(list);
                list = new ArrayList<>();
            }
        }
        return result;
    
    }

}

4. populating-next-right-pointers-in-each-node,來自LeetCode的一道程序題。大概意思就是將樹的每一層都用指針連起來。

/**
 * Definition for binary tree with next pointer.
 * public class TreeLinkNode {
 *     int val;
 *     TreeLinkNode left, right, next;
 *     TreeLinkNode(int x) { val = x; }
 * }
 */
import java.util.ArrayList;
import java.util.Queue;
public class Solution {
    public void connect(TreeLinkNode root) {
        if(root!=null && (root.left!=null || root.right!=null)){
            ArrayList<TreeLinkNode> q = new ArrayList<>();
            TreeLinkNode temp = null;
            int front = -1;
            int rear = -1;
            int last = 0;
            int level = 0;
            q.add(root);
            rear++;
            while(front != rear){
                front++;
                temp = q.get(front);
                if(temp.left!=null){
                    q.add(temp.left);
                    rear++;
                }
                if(temp.right!=null){
                    q.add(temp.right);
                    rear++;
                }
                if(front==last){
                    //表示到了這一層的最後一個節點  將這一層的節點的next連接起來
                    last = rear;
                    for(int i=front+1;i<q.size()-1;i++){
                        q.get(i).next = q.get(i+1);
                    }
                }
            }
        }
    }
}

5. 求樹的寬度,這個就是求出某一層的最多節點數,一樣是利用數的層次遍歷的思想。

import java.util.ArrayList;

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
import java.util.LinkedList;
import java.util.Queue;
import java.util.ArrayList;
public class Solution {
    public int Print(TreeNode pRoot) {
        ArrayList<Integer> list = new ArrayList<>();
        Queue<TreeNode> q = new LinkedList<>();
        TreeNode temp = null;
        if(pRoot==null)
          return 0;
        int front = -1;
        int rear = -1;
        int last=0;
        int level=0; 
        int width = 0;
        q.offer(pRoot);
        rear++;
        while(q.size()!=0){
            temp = q.poll();
            front++;
            list.add(temp.val);
            if(temp.left!=null){
                q.offer(temp.left);
                rear++;
            }
            if(temp.right!=null){
                q.offer(temp.right);
                rear++;
            }
            if(front==last){
                level++;
                last=rear;
                if(width<list.size())
                    width = list.size();
                list = new ArrayList<>();
            }
        }
        return width;
    
    }

}

以上就是在刷題過程中碰到的使用樹的層次遍歷的思想的程序設計題,其實只要瞭解樹的層次遍歷的核心,無論這些題目怎麼變,只要在基礎的代碼上加以修改,就很容易解出來。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章