Skip to content

Instantly share code, notes, and snippets.

@HongfeiXu
Last active January 28, 2018 09:32
Show Gist options
  • Save HongfeiXu/4709f736baaa41b5e0099adc98aa5d27 to your computer and use it in GitHub Desktop.
Save HongfeiXu/4709f736baaa41b5e0099adc98aa5d27 to your computer and use it in GitHub Desktop.
// Definition for a binary tree node.
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) { }
};
// 使用先序遍历将二叉树转化为一个字符序列表示的二叉树
void treeToSequence(TreeNode* root, string& result)
{
if (root == nullptr)
return;
result.append(to_string(root->val));
if (root->left != nullptr || root->right != nullptr)
{
result.append("(");
treeToSequence(root->left, result);
result.append(",");
treeToSequence(root->right, result);
result.append(")");
}
}
/*
Input: 1 1
/ \ / \
2 1 1 2
"1(2,1)"
"1(1,2)"
Input: 1 1
/ \
2 2
"1(2,)"
"1(,2)"
*/
// 拷贝一颗二叉树(DFS)
TreeNode* copyTree(TreeNode* root)
{
if (root == nullptr)
return nullptr;
// 拷贝当前根节点
TreeNode* p = new TreeNode(root->val);
// 拷贝左子树
p->left = copyTree(root->left);
// 拷贝右子树
p->right = copyTree(root->right);
return p;
}
// 拷贝该二叉树的对称树
TreeNode* copySymmetricTree(TreeNode* root)
{
if (root == nullptr)
return nullptr;
// 拷贝当前根节点
TreeNode* p = new TreeNode(root->val);
// 拷贝左子树,作为右子树
p->right = copySymmetricTree(root->left);
// 拷贝右子树,作为左子树
p->left = copySymmetricTree(root->right);
return p;
}
// 将二叉树转化为与之对称的二叉树
void symmetricTree(TreeNode* root)
{
if (root == nullptr)
return;
swap(root->left, root->right);
symmetricTree(root->left);
symmetricTree(root->right);
}
// 判断两个二叉树是否相等(DFS)
bool isSame(TreeNode* p, TreeNode* q)
{
if (p == nullptr || q == nullptr)
return p == q;
return (p->val == q->val && isSame(p->left, q->left) && isSame(p->right, q->right));
}
// 判断两个二叉树是否对称
bool isSymmetric(TreeNode* l, TreeNode* r)
{
// 若l,r中有空节点,则两者相同返回true,不同返回false
if (l == nullptr || r == nullptr)
return l == r;
// 当前节点相同,且l的左子树等于r的右子树,l的右子树等于r的左子树,则l和r对称
return (l->val == r->val && isSymmetric(l->left, r->right) && isSymmetric(l->right, r->left));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment