点:二叉树
题意:以前左节点改成右节点,以前右节点改成左节点
剑指offer面试题19
思路:就是左右孩子指针的交换
代码:
#include <iostream>
#include <random>
template<class T> struct Node {
T val;
Node<T> *lchild;
Node<T> *rchild;
Node(T _val):val(_val), lchild(nullptr), rchild(nullptr) {}
};
template<class T> class Btree {
Node<T> *root;
public:
Btree():root(nullptr){}
void Free (Node<T> *cur) {
if (cur) {
Free(cur->lchild);
Free(cur->rchild);
delete cur;
cur = nullptr;
}
}
~Btree () {
Free(root);
}
void Add (int val) {
if (!root) {
root = new Node<T>(val);
} else {
Node<T> *cur = root;
while (cur) {
if (cur->val > val) {
if (cur->lchild) {
cur = cur->lchild;
} else {
Node<T> *newnode = new Node<T>(val);
cur->lchild = newnode;
}
} else if (cur->val < val) {
if (cur->rchild) {
cur = cur->rchild;
} else {
Node<T> *newnode = new Node<T>(val);
cur->rchild = newnode;
}
} else {
break;
}
}
}
}
void Pre (Node<T> *cur) {
if (cur) {
std::cout << cur->val << "\t";
Pre(cur->lchild);
Pre(cur->rchild);
}
}
void pre () {
Pre(root);
std::cout << std::endl;
}
void Mid (Node<T> *cur) {
if (cur) {
Mid(cur->lchild);
std::cout << cur->val << "\t";
Mid(cur->rchild);
}
}
void mid () {
Mid(root);
std::cout << std::endl;
}
void Invert (Node<T> *cur) {
if (cur) {
if (cur->lchild || cur->rchild) {
Node<T> *l = cur->lchild;
cur->lchild = cur->rchild;
cur->rchild = l;
}
Invert(cur->rchild);
Invert(cur->lchild);
}
}
void invert () {
Node<T> *cur = root;
Invert(cur);
}
};
int main () {
std::random_device rd;
Btree<int> bt;
for (int i = 0; i < 15; i++) {
bt.Add(rd() % 100);
}
bt.pre();
bt.mid();
bt.invert();
bt.pre();
bt.mid();
return 0;
}