目录
1. 二叉树节点
typedef struct Node{
char data;
struct Node *left, *right;
Node():left(NULL), right(NULL){};
Node(int d):data(d), left(NULL), right(NULL){};
}*Tree, Node;
2. 二叉树的创建
2.1 根据先序遍历和中序遍历创建二叉树
// 根据前序遍历和中序遍历创建二叉树
Tree createBinaryTree1(string pre, string in){
if(pre.size() == 0){
return NULL;
}
Node *T = new Node(pre.at(0));
int k = find(in.begin(), in.end(), pre.at(0)) - in.begin();
string preStrLeft = pre.substr(1, k);
string preStrRight = pre.substr(1+k);
string inStrLeft = in.substr(0, k);
string inStrRight = in.substr(k+1);
T->left = createBinaryTree1(preStrLeft, inStrLeft);
T->right = createBinaryTree1(preStrRight, inStrRight);
return T;
}
3. 二叉树的遍历
3.1 递归方式遍历
-
递归先序遍历
// 递归前序遍历
void preorderTravel_1(Tree T){
if(T){
visit(T->data);
preorderTravel_1(T->left);
preorderTravel_1(T->right);
}
}
-
递归中序遍历
// 递归中序遍历
void inorderTravel_1(Tree T){
if(T){
inorderTravel_1(T->left);
visit(T->data);
inorderTravel_1(T->right);
}
}
-
递归后序遍历
// 递归后序遍历
void postorderTravel_1(Tree T){
if(T){
postorderTravel_1(T->left);
postorderTravel_1(T->right);
visit(T->data);
}
}
3.2非递归方式遍历
非递归遍历请查看我的这篇博客《二叉树的非递归前序遍历,非递归中序遍历,非递归后序遍历》
3.3层次遍历
// 层次遍历
void levelTravel(Tree T){
if(T==NULL){ return;}
queue<Node *> Q;
Q.push(T);
while(!Q.empty()){
Node *p = Q.front();
Q.pop();
visit(p);
if(p->left){
Q.push(p->left);
}
if(p->right){
Q.push(p->right);
}
}
}
4. 求树的深度
int maxDepth(TreeNode* root) {
if(root == NULL){
return 0;
}
return max(maxDepth(root->left),maxDepth(root->right))+1;
}