二叉树的创建
我们利用递归的思想采用先序(根–>左–>右)的方式创建二叉树
当节点为空时,次啊用‘#’表示
struct TreeNode
{
char val;
TreeNode *lNode, *rNode;
};
/*
这里使用&引用可以使对Node的操作可以影响Node有点难理解,不然可以使用带有返回值的函数继续调用这个TreeNode
*/
void createBiTree(TreeNode *&node){
char ch;
if ((ch = getchar()) == '#'){
node = NULL;
}
else{
node = new TreeNode;
node->val = ch;
createBiTree(node->lNode);
createBiTree(node->rNode);
}
}
二叉树的遍历
以下是遍历部分的代码,依旧采用递归的思想
void pre_travel(TreeNode *root){
if (root != NULL){
cout << root->val;
pre_travel(root->lNode);
pre_travel(root->rNode);
}
}
void mid_travel(TreeNode *root){
if (root != NULL){
mid_travel(root->lNode);
cout << root->val;
mid_travel(root->rNode);
}
}
void post_travel(TreeNode *root){
if (root != NULL){
post_travel(root->lNode);
post_travel(root->rNode);
cout << root->val;
}
}
//example:abc##de#g##f###
int main(){
TreeNode *root = new TreeNode();
cout << "创建树" << endl;
createBiTree(root);
cout << "先序遍历" << endl;
pre_travel(root);
cout << "\n中序遍历" << endl;
mid_travel(root);
cout << "\n后序遍历" << endl;
post_travel(root);
cout << "\n";
system("pause");
return 0;
}
二叉树深度
依旧采用递归的思想,分支、求解、合并,代码如下
int find_depth(TreeNode *node){
if (node == NULL){
return 0;
}
int dritht = find_depth(node->rNode);
int dleft = find_depth(node->lNode);
int temp = 1 + (dritht > dleft ? dritht : dleft);
return temp;
}
二叉树的层次遍历
实现方法——递归
void level_travel(TreeNode *root,int level){
if (!root || level < 0)
return;
if (level == 0)
cout << root->val;
level_travel(root->lNode, level - 1);
level_travel(root->rNode, level - 1);
}
//depth为上一步骤算出的深度
void trevel(TreeNode *root,int depth){
for(int i = 0;i < depth;i++){
level_travel(root,i);
cout << endl;
}
}
实现方法——队列
递归可以看作是利用了栈这样的数据结构,而对于层次模型我们需要用到队列
- 首先我们建立两个队列p,q,p中首先存入root;
- 遍历p中的所有节点,打印出所对应节点的value;
- 将当前节点从队列中弹出,并将其左右子节点存入q中;
- 将p,q队列交换
代码如下
void level_travel(TreeNode *root){
queue<TreeNode*>p, q;
p.push(root);
while (!p.empty()){
while (!p.empty())
{
TreeNode * t = p.front();
cout << t->val << " ";
p.pop();
if (t->lNode)
q.push(t->lNode);
if (t->rNode)
q.push(t->rNode);
}
cout << endl;
swap(p, q);
}