生活随笔
收集整理的這篇文章主要介紹了
二叉树题目----4 前序遍历重构二叉树 AND 求二叉树中所有结点的个数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前序遍歷重構二叉樹
思路
整個二叉樹用數組存儲因為先序遍歷它先遍歷根,再遍歷左,左邊沒有跑完是不會去遍歷右邊的,所以遍歷左子樹,就是數組元素每回向后一個,個數-1遍歷右邊時,就是數組起始位置+左子樹跑到的位置+每次往后走一個,大小就是減去左子樹用掉的個數+每回個數-1因為要返回遍歷的位置,和遍歷用掉的個數,所以每回都要返回兩個值,用結構體返回。
#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
;
} 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
);
}
總結
以上是生活随笔為你收集整理的二叉树题目----4 前序遍历重构二叉树 AND 求二叉树中所有结点的个数的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。