二叉树的定义
struct TreeNode
{
int val;
TreeNode *left,*right;
TreeNode(int x):val(x),left(0),right(0){}
};
1.求二叉树的结点个数
int f(TreeNode *root)
{
if(!root)return 0;
return f(root->left)+f(root->right)+1;
}
2.求二叉树的深度
int f(TreeNode *root)
{
if(!root)return 0;
return max(f(root->left),f(root->right))+1;
}
3.前、中、后序遍历
void preorderTraversal(TreeNode *root)
{
if(root)
{
cout<<root->val<<' ';
preorderTraversal(root->left);
preorderTraversal(root->right);
}
}
void inorderTraversal(TreeNode *root)
{
if(root)
{
inorderTraversal(root->left);
cout<<root->val<<' ';
inorderTraversal(root->right);
}
}
void postorderTraversal(TreeNode *root)
{
if(root)
{
postorderTraversal(root->left);
postorderTraversal(root->right);
cout<<root->val<<' ';
}
}
http://blog.csdn.net/hz5034/article/details/45582493
http://blog.csdn.net/hz5034/article/details/45599957
4.层序遍历
void levelorderTraverse(TreeNode *root)
{
if(!root)return;
queue<TreeNode *> q;
q.push(root);
TreeNode *p;
while(!q.empty())
{
p=q.front();
q.pop();
cout<<p->val<<' ';
if(!p->left)q.push(p->left);
if(!p->right)q.push(p->right);
}
}
http://blog.csdn.net/hz5034/article/details/44275239
5.重建二叉树
//前序+中序
TreeNode *rebuild(int pre[],int in[],int n)
{
if(n==0)return 0;
TreeNode *root=new TreeNode(pre[0]);
int i;
for(i=0;i<n;++i)
{
if(in[i]==root->val)break;
}
//重建左子树
root->left=rebuild(pre+1,in,i);
//重建右子树
root->right=rebuild(pre+i+1,in+i+1,n-i-1);
return root;
}
//中序+后序
TreeNode *rebuild(int in[],int post[],int n)
{
if(n==0)return 0;
TreeNode *root=new TreeNode(post[n-1]);
int i;
for(i=0;i<n;++i)
{
if(in[i]==root->val)break;
}
//重建左子树
root->left=rebuild(in,post,i);
//重建右子树
root->right=rebuild(in+i+1,post+i,n-i-1);
return root;
}
6.求二叉树中节点的最大距离
struct result
{
int maxDistance;
int maxDepth;
};
result f(TreeNode *root)
{
if(!root)
{
result r={0,-1};
return r;
}
result left=f(root->left);
result right=f(root->right);
result r;
r.maxDistance=max(max(left.maxDistance,right.maxDistance),left.maxDepth+right.maxDepth+1);
r.maxDepth=max(left.maxDepth,right.maxDepth)+1;
return r;
}
http://www.cnblogs.com/miloyip/archive/2010/02/25/1673114.html
7.二叉树中和为某一值的路径
深搜一:
class Solution {
public:
vector<vector<int>> pathSum(TreeNode* root, int sum) {
vector<vector<int> > result;
vector<int> path;
dfs(root,sum,result,path);
return result;
}
void dfs(TreeNode *root,int sum,vector<vector<int> > &result,vector<int> &path)
{
if(!root)return;
path.push_back(root->val);
if(!root->left&&!root->right&&sum==root->val)result.push_back(path);
dfs(root->left,sum-root->val,result,path);
dfs(root->right,sum-root->val,result,path);
path.pop_back();
}
};
深搜二:
class Solution {
public:
vector<vector<int>> pathSum(TreeNode* root, int sum) {
vector<vector<int> > result;
vector<int> path;
int s=0;
dfs(root,sum,result,path,s);
return result;
}
void dfs(TreeNode *root,int sum,vector<vector<int> > &result,vector<int> &path,int &s)
{
if(!root)return;
path.push_back(root->val);
s+=root->val;
if(!root->left&&!root->right&&s==sum)result.push_back(path);
dfs(root->left,sum,result,path,s);
dfs(root->right,sum,result,path,s);
s-=path.back();
path.pop_back();
}
};