一、二叉树的前序遍历(递归实现)LeetCode144题
1.1 题目描述
给定一个二叉树,返回它的 前序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,2,3]
1.2 解题思路
1.3 代码实现
int treeSize(struct TreeNode* root)//计算所遍历二叉树节点的个数
{
if(root == NULL)
return 0;
else
return treeSize(root->left)+treeSize(root->right)+1;
}
//为方便递归构造的子函数
void _preorderTraversal(struct TreeNode* root,int* preorder,int* pindex)
{
if(root == NULL)
return;
preorder[*pindex] = root->val;//访问根节点
++(*pindex);
_preorderTraversal(root->left,preorder,pindex);//访问左子树
_preorderTraversal(root->right,preorder,pindex);//访问右子树
}
int* preorderTraversal(struct TreeNode* root, int* returnSize) {
*returnSize = treeSize(root);
int* preorder = (int*)malloc(*returnSize * sizeof(int));
int index = 0;
_preorderTraversal(root,preorder,&index);
return preorder;
}
二、二叉树的中序遍历(递归实现)LeetCode94题
2.1 题目描述
给定一个二叉树,返回它的 中序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,3,2]
2.2 解题思路
- 代码大致与前序相同,只是先遍历左子树,再根节点,再右子树,一样定义一个数组inorder,记录中序遍历的结果。
2.3 代码实现
int treeSize(struct TreeNode* root)
{
if(root == NULL)
return 0;
else
return treeSize(root->left)+treeSize(root->right)+1;
}
void _postorderTraversal(struct TreeNode* root,int* postorder,int* pindex)
{
if(root == NULL)
return;
_postorderTraversal(root->left,postorder,pindex);
postorder[*pindex] = root->val;
++(*pindex);
_postorderTraversal(root->right,postorder,pindex);
}
int* postorderTraversal(struct TreeNode* root, int* returnSize) {
*returnSize = treeSize(root);
int* postorder = (int*)malloc(*returnSize*sizeof(int));
int index = 0;
_postorderTraversal(root,postorder,&index);
return postorder;
}
三、二叉树的后序遍历(递归实现)LeetCode144题
3.1 题目描述
给定一个二叉树,返回它的 后序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [3,2,1]
3.2 解题思路
- 代码大致与前序相同,只是先遍历左子树,再右子树,再根节点,一样定义一个数组postorder,记录后序遍历的结果。
3.3 代码实现
int treeSize(struct TreeNode* root)
{
if(root == NULL)
return 0;
else
return treeSize(root->left)+treeSize(root->right)+1;
}
void _postorderTraversal(struct TreeNode* root,int* postorder,int* pindex)
{
if(root == NULL)
return;
_postorderTraversal(root->left,postorder,pindex);
_postorderTraversal(root->right,postorder,pindex);
postorder[*pindex] = root->val;
++(*pindex);
}
int* postorderTraversal(struct TreeNode* root, int* returnSize) {
*returnSize = treeSize(root);
int* postorder = (int*)malloc(*returnSize*sizeof(int));
int index = 0;
_postorderTraversal(root,postorder,&index);
return postorde;
}
四、相同的树LeetCode100题
4.1 题目描述
给定两个二叉树,编写一个函数来检验它们是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例 1:
输入: 1 1
/ \ / \
2 3 2 3
[1,2,3], [1,2,3]
输出: true
示例 2:
输入: 1 1
/ \
2 2
[1,2], [1,null,2]
输出: false
示例 3:
输入: 1 1
/ \ / \
2 1 1 2
[1,2,1], [1,1,2]
输出: false
4.2 解题思路
4.3 代码实现
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
if(p == NULL && q == NULL)
return true;
else if(p != NULL && q != NULL)
{
return p->val == q->val
&& isSameTree(p->left,q->left)
&& isSameTree(p->right,q->right);
}
else
return false;
}