二叉樹的鏈式訪問 與 二叉樹專題

目錄

  • 二叉樹的前、中、后序遍歷
  • 求二叉樹第K層節點的個數
  • 二叉樹查找值為x的節點
  • leetcode相同的樹
  • 對稱二叉樹
  • 二叉樹的前序遍歷
  • 另一棵子樹
  • 牛客 二叉樹的遍歷

二叉樹的前、中、后序遍歷

1.前序遍歷:先訪問節點,再訪問子樹,最后訪問子樹
根 左 右
2.中序遍歷:先訪問子樹,再訪問,最后訪問子樹
左 根 右
3.后序遍歷:先訪問子樹,再訪問子樹,最后訪問
左 右 根

N 表示 NULL
前序訪問順序:1 2 3 N N N 4 5 N N 6 N N
中序訪問順序:N 3 N 2 N 1 N 5 N 4 N 6 N
后序訪問順序:N N 3 N 2 N N 5 N N 6 4 1
在這里插入圖片描述

求二叉樹第K層節點的個數

子問題是:root不為空,k不等于1
轉化為求左子樹加右子樹第三層的節點個數
每層k都減1,如果該層有root == NULL就返回0
在這里插入圖片描述


//求二叉樹第k層的節點個數 
int TreeLevelKSize(BTNode* root,int k)
{if (root == NULL)return 0;if (k == 1)return 1;return TreeLevelKSize(root->left, k-1) + TreeLevelKSize(root->right, k-1);
}

二叉樹查找值為x的節點

找到一個值為x的節點就返回,因為函數只有一個返回值
return 只能返回給上一層
如果找到了不存入一個變量中,找到的值就會重復找(后面會丟失找到的值)

//二叉樹查找值為x的節點
BTNode* TreeFind(BTNode* root, BTDataType x)
{if (root == NULL)return NULL;if (root->val == x)return root;//只能返回給它的上一層//前序遍歷BTNode* ret1 = TreeFind(root->left, x);if (ret1)return ret1;BTNode* ret2 = TreeFind(root->right, x);if (ret2)return ret2;//都沒找到return NULL;
}

leetcode相同的樹

在這里插入圖片描述
思路:
比較兩棵樹的根,左子樹和右子樹是否相等
1.兩棵樹的根都為NULL,返回true
2.其中一棵樹的根為NULL,兩樹的節點不相同返回false
3.兩樹的根都不為NULL,比較兩樹的根的值
4.子問題:遍歷兩樹的左子樹和右子樹(比較左根和右根)

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
bool isSameTree(struct TreeNode* p, struct TreeNode* q) 
{if(p == NULL&&q == NULL)return true;//其中一個節點為空,另一個節點不為空,返回falseif(p == NULL || q == NULL)return false;//兩個節點都不為空if(p->val != q->val)return false;return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
}

對稱二叉樹

在這里插入圖片描述
思路:
這題和上一題很想,可以理解為鏡像二叉樹(即一棵樹的左子樹和右子樹要一樣,一棵樹的右子樹和左子樹要一樣)

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
bool _isSymmetric(struct TreeNode* p,struct TreeNode* q)
{if(p == NULL&&q == NULL)return true;if(p == NULL||q == NULL)return false;if(p->val != q->val)return false;return _isSymmetric(p->left,q->right)&&_isSymmetric(p->right,q->left);
}
bool isSymmetric(struct TreeNode* root) 
{return _isSymmetric(root->left,root->right);
}

二叉樹的前序遍歷

在這里插入圖片描述
思路:
1.先算出二叉樹中有多少個節點,再開辟這么多個節點
這樣不會造成空間不足或空間浪費
2.i 是數組的下標,要用指針傳遞過去,不用指針的話,形參i的改變不會影響實參i,可能會覆蓋前面的值
在這里插入圖片描述
3.前序遍歷,如果有節點就把節點中的值放入數組中,如果沒有就返回NULL,遵循根左右依次把值放入數組中

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
/*** Note: The returned array must be malloced, assume caller calls free().*/
//算出樹的節點個數
int TreeSize(struct TreeNode* root)
{return root == NULL ? 0 : TreeSize(root->left) + TreeSize(root->right) + 1;
}
//前序遍歷
void preorder(struct TreeNode* root,int* arr,int* pi)
{if(root == NULL)return;arr[(*pi)++] = root->val;preorder(root->left,arr,pi);preorder(root->right,arr,pi);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize) 
{*returnSize = TreeSize(root);int* arr = (int*)malloc(sizeof(int)*(*returnSize));//前序遍歷int i = 0;//下標是一個小坑,如果不用指針,每次遞歸調用i的值是形參有時會覆蓋前面的值preorder(root,arr,&i);return arr;
}

另一棵子樹

在這里插入圖片描述
思路:
1.root在走,直到root == NULL都沒找到值和subRoot相同的節點,那么就返回false
2.如果能找到和root相同的節點,那么比較root后面的節點(子樹中)是否和subRoot相同
3.只要找到一個子樹是和subRoot相同的那么就返回true

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*///這里面子樹與另一題兩個子樹是否相同有一樣的邏輯
bool issametree(struct TreeNode* p,struct TreeNode* q)
{if(p == NULL&&q == NULL)return true;if(p == NULL || q == NULL)return false;if(p->val != q->val)return false;return issametree(p->left,q->left) && issametree(p->right,q->right);
}
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot)
{//subRoot不為空,使用root在遞歸,所以root可能會走到空false//subRoot至少有一個節點if(root == NULL)return false;if(root->val == subRoot->val&&issametree(root,subRoot))return true;//root在走,subRoot不走,之后利用root和subRoot相等的節點,再用issametree比較是否是子樹return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);
}

牛客 二叉樹的遍歷

在這里插入圖片描述
思路:
總體來說是先開一個100個字符的字符串數組,然后構建節點,最后中序遍歷打印數組
1.構建節點時要注意如果root == ‘#’時,不能在判斷的時候(*pi)++,如果它不是‘#’的話還++就跳過一個字符了
2.開1個節點的樹,就把數組中的值放入樹中,然后為左樹和右樹開辟一個節點,最后返回根節點,把各個節點鏈接起來return root是為了鏈接節點

#include <stdio.h>
#include<stdlib.h>typedef struct TreeNode
{ struct TreeNode* left;struct TreeNode* right;int val;
}TreeNode;
//構建節點
TreeNode* CreatTree(char* a,int* pi)
{if(a[*pi] == '#'){(*pi)++;return NULL;}//非空TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));root->val = a[(*pi)++];//下面這里沒有想出來,遞歸root的左邊創建一個節點,//然后遞歸root的右邊創建一個節點,//最后返回根,鏈接起來root->left = CreatTree(a,pi);root->right = CreatTree(a,pi);return root;
}
//中序遍歷
void order(TreeNode* root)
{if(root == NULL)return;order(root->left);printf("%c ",root->val);order(root->right);
}
int main() 
{char a[100];scanf("%s",a);int i = 0;TreeNode* ret = CreatTree(a,&i);order(ret);return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/40643.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/40643.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/40643.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【備忘】fastadmin 如何獲取列表選中行的pk

去官方搜沒搜出來&#xff0c;還得是萬能的網友厲害。 //獲取選中項 $(document).on("click", ".btn-selected", function () {// 獲取選中項idsconsole.log(JSON.stringify(Table.api.selectedids(table)));// 獲取選中項所有數據console.log(JSON.strin…

輸入一個整數n,輸出n的約數為質數的數?兩個問題n的約數問題和n的質數問題

輸入一個整數n&#xff0c;輸出n的約數為質數的數&#xff1f; 一.首先解決n的質數的問題&#xff08;1&#xff09;枚舉法&#xff08;2&#xff09;埃氏篩 二.解決n的質數約數問題 一.首先解決n的質數的問題 &#xff08;1&#xff09;枚舉法 考慮質數的定義&#xff1a;在大…

conda中創建環境并安裝tensorflow1版本

conda中創建環境并安裝tensorflow1版本 一、背景二、命令三、驗證一下 一、背景 最近需要使用tensorflow1版本的&#xff0c;發個記錄&#xff01; 二、命令 conda create -n tf python3.6 #創建tensorflow虛擬環境 activate tf #激活環境&#xff0c;每次使用的時候都…

理解策略梯度方法:從REINFORCE到PPO

今年2月的時候&#xff0c;導師突然告訴我Ron William離世了。他算是我導師的 a life time friend&#xff0c;關系很好&#xff0c;我做畢業論文的時候&#xff0c;他還來參與了論文的答辯。Ron是一個很友善的老頭&#xff0c;和他在強化學習領域的影響力比起來&#xff0c;本…

汽車信息安全--數據安全:圖像脫敏

General 隨著車聯網的發展&#xff0c;汽車越來越智能化&#xff0c;就像是一部“裝著四個輪子的手機”。 有人說&#xff0c;智能手機就如同一部竊聽器&#xff0c;無論你開機或者關機&#xff0c;它都會無時不刻地監聽著用戶的一舉一動。 可想而知&#xff0c;智能車輛上…

馬工程刑法期末復習筆記重點2

馬工程刑法期末復習筆記重點2

SpringBoot 參數校驗

參數校驗 引入springvalidation依賴 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId> </dependency>參數前添加Pattern public Result registry(Pattern(regexp &qu…

Java面向對象練習(2.商品類)(2024.7.4)

商品類 package Supermarket20240704;public class Commodity {private String name;private double price;private int inventory;public Commodity(){};public Commodity(String name, double price, int inventory){this.name name;this.price price;this.inventory inv…

Java核心技術【十九】Iterator與增強for循環

Java中的Iterator與增強for循環 在Java編程中&#xff0c;迭代是處理集合元素的一種常見操作。Java提供了多種迭代集合元素的方式&#xff0c;其中最常用的兩種是Iterator和增強for循環&#xff08;也稱為“for-each”循環&#xff09;。本文將深入探討這兩種迭代方式的特性和…

CLAM用于弱監督WSI分析

計算病理學&#xff08;computational pathology&#xff09;下的深度學習方法需要手動注釋大型 WSI 數據集&#xff0c;并且通常存在領域適應性和可解釋性較差的問題。作者報告了一種可解釋的弱監督深度學習方法&#xff0c;只需要WSI級標簽。將該方法命名為聚類約束注意力多實…

Perl 格式化輸出:提升代碼可讀性的技巧

引言 Perl 是一種功能強大的腳本語言&#xff0c;廣泛用于文本處理、系統管理、網絡編程等多個領域。在 Perl 編程中&#xff0c;代碼的格式化輸出不僅有助于提升代碼的可讀性&#xff0c;還能增強程序的用戶體驗。本文將詳細介紹如何在 Perl 中實現代碼的格式化輸出。 Perl …

【HarmonyOS4學習筆記】《HarmonyOS4+NEXT星河版入門到企業級實戰教程》課程學習筆記(二十一)

課程地址&#xff1a; 黑馬程序員HarmonyOS4NEXT星河版入門到企業級實戰教程&#xff0c;一套精通鴻蒙應用開發 &#xff08;本篇筆記對應課程第 31 節&#xff09; P31《30.數據持久化-關系型數據庫》 上一節中學習了使用用戶首選項的方式實現數據持久化&#xff0c;但用戶首…

微機原理 選擇題

D C MOV、PUSH、POP、XLAT&#xff08;查表&#xff09;、IN、OUT不影響標志位 D B D C D C D B 1. (單選題, 5分)8位無符號數(字節)表示的數值范圍是( ), 16位無符號數(字)表示的數值范圍是( )。 A. 0~128 0~32768B. 0~255 0~655…

為什么 npm run serve 正常,npm run build 就報錯:digital envelope routines::unsupported

這個錯誤通常與 Node.js 版本和使用的加密算法有關。讓我解釋一下原因和可能的解決方案&#xff1a; 錯誤原因 這個錯誤&#xff08;“error:0308010C:digital envelope routines::unsupported”&#xff09;通常發生在以下情況&#xff1a; 使用較新版本的 Node.js&#xf…

Vscode快捷鍵崩潰

Vscode快捷鍵崩潰 Linux虛擬機下使用vscode寫代碼【ctrlA&#xff0c;CtrlC&#xff0c;CtrlV】等快捷鍵都不能使用&#xff0c;還會出現“NO text insert“等抽象的指令&#xff0c;問題就是不知道什么時候裝了一個VIM插件&#xff0c;讓他滾出電腦》》》

監聽 web 容器內的網絡請求(錯誤的方案)

需求 iOS 項目中 wkwebview 實現的 web 容器&#xff0c;需要監聽 web 容器內的所有網絡請求 實現 在 iOS 項目中使用 WKWebView 實現的 Web 容器&#xff0c;監聽 Web 容器內的網絡請求是一個常見需求。可以通過實現 WKURLSchemeHandler 協議來處理自定義的 URL scheme&#…

通過 API 接口管理 Kafka

文章目錄 前言Topic 管理配置管理消費者群組管理查看消費者群組修改消費者群組 為主題添加分區從主題中刪除消息首領選舉 前言 除了通過命令行和可視化界面對 kafka 進行管理&#xff0c;也可以通過 AdminClient的 API 對 kafka 進行管理。本文將介紹如何通過 AdminClient 進行…

[Vue學習]生命周期及其各階段舉例

當我們運行vue項目&#xff0c;看到了屏幕上顯示的界面&#xff0c;看到了界面上顯示的數據和標簽&#xff0c;之后將這個界面叉掉&#xff0c;這一過程其實經歷了一整個vue的生命周期的四個階段&#xff0c;即創建階段、掛載階段、更新階段以及銷毀階段, 而對于每個階段的啟動…

使用 pyecharts 渲染成圖片程序報錯: echarts is not defined問題處理

背景 之前寫的使用 snapshot_selenium 來保存pyeacharts渲染成的網頁截圖&#xff0c;可以正常運行。程序擱置了半年&#xff0c;不知道動了電腦哪里&#xff0c;再次運行程序時&#xff0c;程序開始報錯&#xff1a;JavascriptException: javascript error: echarts is not d…

【SQL】已解決:SQL分組去重并合并相同數據

文章目錄 一、分析問題背景二、可能出錯的原因三、錯誤代碼示例四、正確代碼示例五、注意事項 已解決&#xff1a;SQL分組去重并合并相同數據 在數據庫操作中&#xff0c;數據的分組、去重以及合并是常見需求。然而&#xff0c;初學者在編寫SQL語句時&#xff0c;可能會遇到一…