LeetCode每日一题: 单值二叉树(No.965)
生活随笔
收集整理的這篇文章主要介紹了
LeetCode每日一题: 单值二叉树(No.965)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目:單值二叉樹
如果二叉樹每個節點都具有相同的值,那么該二叉樹就是單值二叉樹。 只有給定的樹是單值二叉樹時,才返回 true;否則返回 false。 復制代碼
示例:
輸入:[1,1,1,1,1,null,1] 輸出:true 復制代碼 輸入:[2,2,2,5,2] 輸出:false 復制代碼
思考:
這道題只要遍歷二叉樹的每個節點然后比較每個節點的值即可。所以這題其實就是回顧二叉樹的遍歷方法。 復制代碼
實現:
/*** Definition for a binary tree node.* public class TreeNode { * int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val = x; }* }*/class Solution {public ArrayList<Integer> list = new ArrayList<>();public boolean isUnivalTree(TreeNode root) {//遍歷二叉樹將節點值加入到list中dfs(root);//比較節點值是否相等for (int count = 1; count < list.size(); count++) {if (list.get(0) != list.get(count)) {return false;}}return true;}//遞歸遍歷二叉樹private void dfs(TreeNode node) {if (node != null) {list.add(node.val);dfs(node.left);dfs(node.right);}} } 復制代碼
二叉樹遍歷方法:
深度遍歷:
1.先序遍歷
遍歷順序:根節點-左子節點-右子節點
遞歸實現:
非遞歸實現:
public void dfs(TreeNode root) {//非遞歸需要用棧來記錄節點情況Stack<TreeNode> stack = new Stack<TreeNode>();//記錄當前節點TreeNode cur = root;//當前節點不為空且棧不為空時循環while (cur != null || !stack.isEmpty()) {//當前節點不為空,一直循環,該循環會一直遍歷根節點的左子節點,左子節點的左子節點...直至最左葉子節點。while (cur != null) {//將該節點值放入listlist.add(cur.val);//將當前節點入棧stack.push(cur);//當前節點指向其左節點cur = cur.left;} //遍歷到最左葉子節點跳出循環//棧不為空時,取出棧頂節點,即最左葉子節點,將當前節點指向其右子節點。//之后回到外層循環,再遍歷右子節點的左子節點if (!stack.isEmpty()) {//取出棧頂元素TreeNode node = stack.pop();//當前節點指向棧頂節點的右子節點cur = node.right;}} 復制代碼2.中序遍歷
遍歷順序:左子節點-根節點-右子節點
遞歸實現:
非遞歸實現:
public void dfs(TreeNode root) {//非遞歸需要用棧來記錄節點情況Stack<TreeNode> stack = new Stack<TreeNode>();//記錄當前節點TreeNode cur = root;//當前節點不為空且棧不為空時循環while (cur != null || !stack.isEmpty()) {//當前節點不為空,一直循環,該循環會一直遍歷根節點的左子節點,左子節點的左子節點...直至最左葉子節點。while (cur != null) {//將當前節點入棧stack.push(cur);//當前節點指向其左節點cur = cur.left;}//遍歷到最左葉子節點跳出循環//棧不為空時,取出棧頂節點,即最左葉子節點,將該節點放入list,再將當前節點指向該節點的右子節點//之后回到外層循環,再遍歷右子節點的左子節點if (!stack.isEmpty()) {//取出棧頂節點TreeNode node = stack.pop();//將該節點放入listlist.add(node.val);//將當前節點指向該節點的右子節點cur = node.right;}}} 復制代碼3.后序遍歷
遍歷順序:左子節點-根節點-右子節點
遞歸實現:
非遞歸實現:
public void dfs(TreeNode root) {//非遞歸需要用棧來記錄節點情況Stack<TreeNode> stack = new Stack<TreeNode>();//記錄當前節點TreeNode cur = root;//后續遍歷需要一個記錄當前節點右子節點是否已被訪問的標記,當cur.right=flag時說明該節點右子節點已被訪問過TreeNode flag = null;//當前節點不為空時一直循環,該循環會一直遍歷根節點的左子節點,左子節點的左子節點...直至最左葉子節點。while (cur != null) {//將當前節點入棧stack.push(cur);//當前節點指向其左節點cur = cur.left;}//遍歷到最左葉子節點跳出循環//棧不為空時循環取出棧頂節點,即最左葉子節點while (!stack.isEmpty()) {//取出棧頂節點,將當前節點指向棧頂節點cur = stack.pop();//如果當前節點的右子節點為空或者右子節點被訪問過if (cur.right == null || cur.right == flag) {//將當前節點放入listlist.add(cur.val);//記錄當前節點flag = cur;} else {//當前節點不為空且沒被訪問過,則將當前節點入棧stack.push(cur);//將當前接單指向其右子節點cur = cur.right;//右子節點不為空while (cur != null) {//將右子節點入棧stack.push(cur);//再將當前節點指向其左子節點cur = cur.left;}}}} 復制代碼層次遍歷:
遍歷順序:按從頂層到底層的次序訪問樹中元素,在同一層中,從左到右進行訪問。
實現:
轉載于:https://juejin.im/post/5cb416aa6fb9a068547349c3
總結
以上是生活随笔為你收集整理的LeetCode每日一题: 单值二叉树(No.965)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PostgreSQL 无会话、有会话模式
- 下一篇: HTTP1.0,HTTP1.1,HTTP