日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode每日一题: 单值二叉树(No.965)

發布時間:2025/5/22 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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.先序遍歷
遍歷順序:根節點-左子節點-右子節點
遞歸實現:

private void dfs(TreeNode node) {if (node != null) {//將根節點放入listlist.add(node.val);//遞歸左節點dfs(node.left);//遞歸右節點dfs(node.right);}} 復制代碼

非遞歸實現:

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.中序遍歷
遍歷順序:左子節點-根節點-右子節點
遞歸實現:

private void dfs(TreeNode node) {if (node != null) {//遞歸左節點dfs(node.left);//將根節點放入listlist.add(node.val);//遞歸右節點dfs(node.right);}} 復制代碼

非遞歸實現:

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.后序遍歷
遍歷順序:左子節點-根節點-右子節點
遞歸實現:

private void dfs(TreeNode node) {if (node != null) {//遞歸左節點dfs(node.left);//遞歸右節點dfs(node.right);//將根節點放入listlist.add(node.val);}} 復制代碼

非遞歸實現:

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;}}}} 復制代碼

層次遍歷:

遍歷順序:按從頂層到底層的次序訪問樹中元素,在同一層中,從左到右進行訪問。
實現:

public void bfs(TreeNode root) {//層次遍歷需要用隊列來記錄節點情況ArrayDeque<TreeNode> queue = new ArrayDeque<TreeNode>();//記錄當前節點TreeNode cur = root;//將根節點加入隊列queue.add(root);//隊列不為空循環隊列while (!queue.isEmpty() ) {//取出隊列中首個節點TreeNode node = queue.remove();//將該節點放入listlist.add(node.val);//左子節點不為空將左子節點入隊 if (node.left != null) {queue.add(node.left);}//右子節點不為空將右子節點入隊if (node.right != null) {queue.add(node.right);}}}復制代碼

轉載于:https://juejin.im/post/5cb416aa6fb9a068547349c3

總結

以上是生活随笔為你收集整理的LeetCode每日一题: 单值二叉树(No.965)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。