二叉樹題目----4 前序遍歷重構二叉樹 AND 求二叉樹中所有結點的個數

前序遍歷重構二叉樹

在這里插入圖片描述

在這里插入圖片描述

思路

  1. 整個二叉樹用數組存儲
  2. 因為先序遍歷它先遍歷根,再遍歷左,左邊沒有跑完是不會去遍歷右邊的,所以遍歷左子樹,就是數組元素每回向后一個,個數-1
  3. 遍歷右邊時,就是數組起始位置+左子樹跑到的位置+每次往后走一個,大小就是減去左子樹用掉的個數+每回個數-1
  4. 因為要返回遍歷的位置,和遍歷用掉的個數,所以每回都要返回兩個值,用結構體返回。
#include<stdlib.h>
#include<stdio.h>
#include<malloc.h>
#include<string.h>
typedef struct  TreeNode
{struct TreeNode *left;struct TreeNode *right;char val;
}TreeNode;typedef struct Result{TreeNode * root; //構建的樹的根結點int used;      //構建過程中用掉的val個數
} Result;Result CreateTree(char preorder[], int size){if (size == 0){Result result;result.root = NULL;result.used = 0;return result;}char rootVal = preorder[0];if (rootVal == '#'){Result result;result.root = NULL;result.used = 1;    //'#'號在數組中也占一個位置return result;}//根的過程TreeNode * root = (TreeNode *)malloc(sizeof(TreeNode));root->val = rootVal;root->left = root->right = NULL;//左子樹Result left_result = CreateTree(preorder + 1, size - 1);//右子樹Result right_result = CreateTree(preorder + 1 + left_result.used, size - 1 - left_result.used);root->left = left_result.root;root->right = right_result.root;Result result;result.root = root;result.used = 1 + left_result.used + right_result.used;return result;
}void InorderTraversal(TreeNode * root){if (root == NULL){return;}InorderTraversal(root->left);printf("%c", root->val);printf(" ");InorderTraversal(root->right);
}void TestCreateTree()
{char preorder[200];scanf("%s", preorder);int size = strlen(preorder);Result result = CreateTree(preorder, size);InorderTraversal(result.root);
}int main()
{TestCreateTree();return 0;
}

求二叉樹中所有結點的個數

思路

遍歷整棵樹,不是空結點,個數就++

void TreeSize(TreeNode *root, int *size){if (root == NULL){return;}(*size)++;TreeSize(root->left,size);TreeSize(root->right,size);}

思路2

根+左結點個數+右結點個數

int TreeSize2(TreeNode *root){if (root == NULL){return 0;}return 1 + TreeSize2(root->left) + TreeSize2(root->right);
}

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

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

相關文章

二叉樹的進階操作---(求二叉樹中所有結點個數,求葉子結點個數,求第k層結點個數;在二叉樹中查找某一結點;層序遍歷;判斷是否為完全二叉樹)

typedef struct TreeNode {struct TreeNode *left;struct TreeNode *right;char val; }TreeNode;typedef struct Result{TreeNode * root; //構建的樹的根結點int used; //構建過程中用掉的val個數 } Result;求二叉樹中所有結點個數 void TreeSize(TreeNode *root, int …

c++中的智能指針詳解(RAII, auto_ptr的原理及其改進,unique_ptr的原理,shared_ptr的原理,shared_ptr的缺陷及其改進)

為什么需要智能指針 代碼中途退出&#xff0c;也能保證資源的合理釋放&#xff0c;在c中沒有垃圾回收機制的情況下&#xff0c;智能指針就可以保證我們申請的資源&#xff0c;最后忘記釋放的問題&#xff0c;防止內存泄露&#xff0c;也幫我們減少了一定的負擔&#xff0c;不用…

Job for mariadb.service failed because the control process exited with error code. Se

錯誤&#xff1a;[rootlocalhost ~]# systemctl start mariadb.service Job for mariadb.service failed because the control process exited with error code. See “systemctl status mariadb.service” and “journalctl -xe” for details. 解決辦法&#xff1a; [rootl…

二叉樹題目----5 平衡二叉樹 AND 根據二叉樹創建字符串

平衡二叉樹 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/int MAX(int a,int b) {return a > b ? a : b; }//求高度 int getHeight(struct TreeNode *root){if(root NULL){…

再寫堆(堆的性質,向下調整,建堆,堆的插入刪除初始化,堆排序,TopK問題)

堆的概念 如果有一個關鍵碼的集合K{k0,k1,k2,…,kn-1},把它的所有元素按完全二叉樹的順序存儲方式存儲再一個一維數組中&#xff0c;并滿足:Ki<K2i1且Ki<K2i1(Ki > K2i1 且 Ki > K2i2),i0,1,2,3…。則稱為小堆(或大堆)。將根結點最大的堆叫做最大堆或大根堆&#…

二叉樹題目----6 二叉樹的最近公共祖先 AND 二叉樹搜索樹轉換成排序雙向鏈表

二叉樹的最近公共祖先 思路 在左、右子樹中分別查找是否包含p或q&#xff1a;如果以下兩種情況&#xff08;左子樹包含p&#xff0c;右子樹包含q/左子樹包含q&#xff0c;右子樹包含p&#xff09;&#xff0c;那么此時的根節點就是最近公共祖先如果左子樹包含p和q&#xff0c;…

二叉樹題目 ----7 前序中序遍歷構造二叉樹

前序中序遍歷構造二叉樹 思路 在前序中找根結點根據根結點 中序&#xff0c;分成左右兩棵子樹根據子樹長度&#xff0c;把前序分成左右兩顆子樹遞歸處理子樹 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* s…

關聯式容器(map,set,multimap,multiset)

關聯式概念 STL中的部分容器&#xff0c;比如&#xff1a;vector、list、deque、forward_list(C11)等&#xff0c;這 些容器統稱為序列式容器&#xff0c;因為其底層為線性序列的數據結構&#xff0c;里面存儲的是元素本身。關聯式容器也是用來存儲數據的&#xff0c;與序列式…

詳解 二叉搜索樹-----AVL樹

二叉搜索樹 根結點比左子樹中所有結點都大根結點比右子樹所有結點都小最小的元素在最左側最大的元素在最右側中序遍歷有序 具有以上的特征的二叉樹就是二叉搜索樹也叫二叉排序數 二叉搜索樹的操作 查找 要保存查找值的雙親&#xff0c;以便于后續執行插入操作 Node* Find(…

json格式與cJSON函數庫

json的格式 鍵/值對 key:value&#xff0c;用半角冒號分割文檔對象 JSON對象寫在花括號中&#xff0c;可以包含多個鍵/值對。數組 JSON 數組在方括號中書寫&#xff1a; 數組成員可以是對象&#xff0c;值&#xff0c;也可以是數組(只要有意義)。 { "stars":[ { &qu…

HTTP清晰的學習筆記

HTTP協議—應用層 請求消息(Request)—瀏覽器給服務器發 包含四部分 請求行&#xff1a;說明請求類型&#xff0c;要訪問的資源&#xff0c;以及使用的http版本請求頭&#xff1a;說明服務器要使用的附加信息,由鍵值對構成的空行&#xff1a;空行是必須要有的&#xff0c;即…

如何在 Centos7 x86_64下將vim一鍵配置為一款強大的C++,IDE

vim功能很強大&#xff0c;但是對于我這樣的小白很不友好 然后就有一位大佬&#xff0c;為了輔助我這樣的菜雞&#xff0c;然后供我們一鍵搞定&#xff0c;在vim暢快編寫代碼的功能。 首先強烈不推薦在root用戶下使用&#xff0c;確保電腦連著網。在普通用戶下執行此命令 cur…

聽說今天發表文章給勛章

聽說今天發表文章給勛章

詳解string容器(應用+模擬實現,string練習題)

為什么要有string容器 string&#xff1a;其實就是一個字符串,c對字符串進行了封裝的&#xff0c;封裝到一個類里面&#xff0c;這樣用戶就不用擔心開辟空間的問題&#xff0c;只需要往string類里放字符串就可以了&#xff0c;string其實還可以自增長 很多人就會有一個疑問&am…

淺拷貝+引用計數--寫時拷貝---模擬實現string容器

引用計數 深拷貝 多個對象共享同一份資源時&#xff0c;最后能夠保證該資源只被釋放一次 應該由哪個對象釋放資源&#xff1f; 由最后一個使用該資源的對象去釋放 怎么知道一個對象是最后一個使用該資源的對象&#xff1f; 給一個計數&#xff0c;記錄使用該資源對象的個數 實…

詳解vector容器(應用+模擬實現,vector相關練習題)

vector容器 動態的順序表&#xff0c;數組。 vector操作 vector操作及其概念 構造 vector<int>v1;vector<int>v2(10, 5);vector<int>v3(v2);int array[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };vector<int>v4(array, array sizeof(array) / sizeof(a…

詳解list容器(應用+模擬實現)

list容器 帶頭結點的雙向循環鏈表 list操作 list容器的概念及其操作 構造和銷毀 list<int>L1;list<int>L2(10, 5);vector<int>v{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };list<int>L3(v.begin(), v.end());list<int>L4(L3);元素訪問 cout << L3.…

vector和list容器有哪些區別

這個問題的本質還是在問順序表和鏈表的區別 底層結構不同 vector容器list容器一段連續的空間帶頭結點的雙向循環鏈表 元素訪問方式 vector容器list容器支持隨機訪問—O(1)不支持隨機訪問—O(N)需要擴容不需要擴容任意位置插入元素----O(N)–搬移元素O(1) 迭代器不同 vector…

復習棧和隊列,詳解最小棧,棧的彈出壓入序列,逆波蘭表達式求值

棧和隊列的概念 棧:吃進去吐出來 對列&#xff1a;吃進去拉出來 數據結構中的棧和內存中的區別 數據結構中的棧具有后進先出的特性&#xff0c;而內存中的棧是一個內存空間&#xff0c;只不過這個內存空間具與數據結構的棧具有相同的特性。 棧和隊列操作 棧和隊列基本操作…

CentOS7關閉防火墻

firewalld的基本使用 啟動 systemctl start firewalld關閉 systemctl stop firewalld查看狀態 systemctl status firewalld 開機禁用 systemctl disable firewalld開機啟用 systemctl enable firewalldCentOS 7的服務管理 啟動一個服務 systemctl start firewalld.service關閉…