二叉树面试题

二叉树的定义

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();
	}
};




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值