1. 二叉树的前序遍历
题目描述:给定一个二叉树,返回它的前序遍历。
int TreeSize(struct TreeNode* root)
{
if(root==NULL)
return 0;
return 1+TreeSize(root->left)+TreeSize(root->right);
}
void _preorderTraversal(struct TreeNode* root, int* retA, int* pi)
{
if(root == NULL)
return;
retA[(*pi)++] = root->val;
_preorderTraversal(root->left,retA,pi);
_preorderTraversal(root->right,retA,pi);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize){
//1.先开空间大小
int size =TreeSize(root);
int* retA = malloc(sizeof(int)*size);
*returnSize = size;
//2.按前序遍历,放入retA数组
int i =0;
_preorderTraversal(root,retA, &i);
//3.返回retA数组
return retA;
}
2. 二叉树的中序遍历
int TreeSize(struct TreeNode* root)
{
if(root==NULL)
return 0;
return 1+TreeSize(root->left)+TreeSize(root->right);
}
void _inorderTraversal(struct TreeNode* root, int* retA, int* pi)
{
if(root == NULL)
return;
_inorderTraversal(root->left,retA,pi);
retA[(*pi)++] = root->val;
_inorderTraversal(root->right,retA,pi);
}
int* inorderTraversal(struct TreeNode* root, int* returnSize){
//1.先开空间大小
int size =TreeSize(root);
int* retA = malloc(sizeof(int)*size);
*returnSize = size;
//2.按中序遍历,放入retA数组
int i =0;
_inorderTraversal(root,retA, &i);
//3.返回retA数组
return retA;
}
3. 二叉树的后续遍历
int TreeSize(struct TreeNode* root)
{
if(root==NULL)
return 0;
return 1+TreeSize(root->left)+TreeSize(root->right);
}
void _postorderTraversal(struct TreeNode* root, int* retA, int* pi)
{
if(root == NULL)
return;
_postorderTraversal(root->left,retA,pi);
_postorderTraversal(root->right,retA,pi);
retA[(*pi)++] = root->val;
}
int* postorderTraversal(struct TreeNode* root, int* returnSize){
//1.先开空间大小
int size =TreeSize(root);
int* retA = malloc(sizeof(int)*size);
*returnSize = size;
//2.按后序遍历,放入retA数组
int i =0;
_postorderTraversal(root,retA, &i);
//3.返回retA数组
return retA;
}
4. 一颗树的子树
题目描述:给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。
分析:
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* s, struct TreeNode* t){
if(s==NULL)
return false;
if(isSameTree(s,t))
return true;
return isSubTree(s->left,t) || isSubTree(s->right,t);
}
5. 平衡二叉树
题目描述:给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1.
int Depth(struct TreeNode* root){
if(root==NULL)
return 0;
int leftDepth = Depth(root->left);
int rightDepth = Depth(root->right);
return leftDepth > rightDepth ? leftDepth+1 : rightDepth +1;
}
bool isBalanced(struct TreeNode* root){
if(root==NULL)
return true;
int leftDepth =Depth(root->left);
int rightDepth=Depth(root->right);
return abs(leftDepth-rightDepth)<2 && isBalanced(root->left) && isBalanced(root->right);
}