二叉树的进阶操作---(求二叉树中所有结点个数,求叶子结点个数,求第k层结点个数;在二叉树中查找某一结点;层序遍历;判断是否为完全二叉树)
生活随笔
收集整理的這篇文章主要介紹了
二叉树的进阶操作---(求二叉树中所有结点个数,求叶子结点个数,求第k层结点个数;在二叉树中查找某一结点;层序遍历;判断是否为完全二叉树)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
typedef struct TreeNode
{struct TreeNode *left;struct TreeNode *right;char val;
}TreeNode;typedef struct Result{TreeNode * root; //構建的樹的根結點int used; //構建過程中用掉的val個數
} Result;
左子樹已知第K-1層結點個數left 右子樹第K-1層結點個數 right 求第K層結點個數
left + right 終止條件 :
空樹 return 0
先看根的val 在根不是我們要找的情況下,去左子樹繼續查找 在左子樹中也沒有找到,繼續去右子樹中查找 空樹 return NULL
求二叉樹中所有結點個數
void TreeSize(TreeNode *root, int *size){if (root == NULL){return;}(*size)++;TreeSize(root->left,size);TreeSize(root->right,size);}//遞推的思想 int TreeSize2(TreeNode *root){if (root == NULL){return 0;}return 1 + TreeSize2(root->left) + TreeSize2(root->right); }求葉子結點個數
//求葉子結點個數 void LeafSize(TreeNode *root, int *leaf_size){if (root == NULL){return;}if (root->left == NULL && root->right == NULL){leaf_size++;}LeafSize(root->left, leaf_size);LeafSize(root->right, leaf_size); }//遞推_葉子結點 int LeafSize2(TreeNode *root){if (root == NULL){return 0;}if (root->left == NULL && root->right == NULL){return 1;}return LeafSize2(root->left) + LeafSize2(root->right); }求第k層結點個數
思路
left + right
空樹 return 0
代碼實現
int LevelK(TreeNode *root, int k) {if (root == NULL){return 0;}//這里不是空樹,層數只有1層if (k == 1){return 1;}//反回左邊的層數+右邊的層數,每回往下走,層數就要減一return LevelK(root->left, k - 1) + LevelK(root->right, k - 1);}在二叉樹中查找某一結點
思路
查找val = x的值
代碼實現
TreeNode *Find(TreeNode *root, char x){if (root == NULL){return NULL;}//根if (root->val == x){return root;}//左子樹不為空就在左子樹找TreeNode *result = Find(root->left, x);if (result != NULL){return result;}//左子樹沒找到//如果右子樹沒找到,那么整個樹都找不到return Find(root->right, x);}層序遍歷
又稱為廣度優先遍歷
思路
代碼實現
//層序遍歷 #include<queue> void LevelorderTraversal(TreeNode *root) {if (root == NULL){return;}std::queue<TreeNode *>qu;qu.push(root);while (!qu.empty()){TreeNode *front = qu.front();qu.pop();printf("%c", front->val);//如果有左孩子if (front->left != NULL){qu.push(front->left);}//如果有右孩子if (front->right != NULL){qu.push(front->right);}} }判斷是否為完全二叉樹
思路
代碼實現
//判斷二叉樹是否為完全二叉樹 #include<queue> bool IsCompleteBinaryTree(TreeNode *root) {if (root == NULL){return true;}std::queue<TreeNode *>qu;qu.push(root);while (1){TreeNode *front = qu.front();qu.pop();if (front == NULL){//遇到空結點了break;}qu.push(front->left);qu.push(front->right);}//檢查隊列中是否還有非空結點while(!qu.empty()){TreeNode *front = qu.front();qu.pop();if (front != NULL){return false;}}return true;}總結
以上是生活随笔為你收集整理的二叉树的进阶操作---(求二叉树中所有结点个数,求叶子结点个数,求第k层结点个数;在二叉树中查找某一结点;层序遍历;判断是否为完全二叉树)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我在西瓜视频被违规了导致中视频计划审核不
- 下一篇: Job for mariadb.serv