1.从二叉树根节点到叶节点和为定值的一个路径。
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
void search(TreeNode* root,int expectNumber, vector<vector<int> >& paths, int curnum, vector<int>& path) {
if (root == nullptr) {
return;
}
path.push_back(root->val);
if ((curnum + root->val == expectNumber) && (!root->left) && (!root->right)) {
paths.push_back(path);
}
if (root->left) {
search(root->left, expectNumber, paths, curnum + root->val, path);
}
if (root->right) {
search(root->right, expectNumber, paths, curnum + root->val, path);
}
path.pop_back();
}
vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
vector<vector<int> > paths;
vector<int> path;
search(root, expectNumber, paths, 0, path);
return paths;
}
2.判断是否是树的子结构
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
bool isSimilarRoot(TreeNode* pRoot1, TreeNode* pRoot2) {
if (pRoot1 && !pRoot2) {
return true;
}
if (!pRoot1 && pRoot2) {
return false;
}
if (!pRoot1 && !pRoot2) {
return true;
}
if (pRoot1->val != pRoot2->val) {
return false;
}
return isSimilarRoot(pRoot1->left, pRoot2->left) && isSimilarRoot(pRoot1->right, pRoot2->right);
}
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
if (pRoot2 == nullptr || pRoot1 == nullptr) {
return false;
}
if (pRoot1->val == pRoot2->val) {
if(isSimilarRoot(pRoot1, pRoot2)) {
return true;
}
}
return HasSubtree(pRoot1->left, pRoot2) || HasSubtree(pRoot1->right, pRoot2);
}
3.输出一个树的镜像
操作给定的二叉树,将其变换为源二叉树的镜像。
输入描述:
二叉树的镜像定义:源二叉树
8
/ \
6 10
/ \ / \
5 7 9 11
镜像二叉树
8
/ \
10 6
/ \ / \
11 9 7 5
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
void SwapTreeNode(TreeNode* &left, TreeNode* &right) {
TreeNode* tmp = left;
left = right;
right = tmp;
}
void Mirror(TreeNode *pRoot) {
if (!pRoot) {
return;
}
SwapTreeNode(pRoot->left, pRoot->right);
Mirror(pRoot->left);
Mirror(pRoot->right);
}