二叉树

二叉树

二叉数的概念和分类
二叉树是每个树节点最多有两个子树的一种特殊的树结构,其有一些内在的性质,
比如,若二叉树的层次从0开始,则在二叉树的第i层至多有 [公式] 个节点(i>=0)
,高度为k的二叉树最多有 [公式] 个节点(空树的高度为-1)。其类别为以下几种:

满二叉树:所有的叶节点全部在底层,并且在底层全部铺满的二叉树
完全二叉树:叶节点只能出现在最后两层,并且最底层的叶节点都向左对齐
二叉搜索树:要求每个节点本身大于其左子树,而小于其右子树,对其进行中序遍历后,
会得到一个有序的列表,这是我们经常用到的一种数的结构
平衡二叉树:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右
两个子树都是一棵平衡二叉树,并且满足二叉搜索树的规则。

二叉树三种遍历模式

前序 中序 后序
在这里插入图片描述
接下来我们以这个图为例进行Coding,用代码来实现这三种遍历方式:
先序遍历 0 1 3 7 8 4 9 2 5 6
中序遍历 7 3 8 1 9 4 2 5 2 6
后序遍历 7 8 3 9 4 1 5 6 2 0
递归版的三种遍历

// 递归版
// 先序遍历
void printPreorder1(TreeNode* head){
    if (head == nullptr){
        return;
    }
    cout << head->value << " ";
    printPreorder1(head->left);
    printPreorder1(head->right);
}
// 中序遍历
void printInorder1(TreeNode* head){
    if (head == nullptr){
        return;
    }
    printInorder1(head->left);
    cout << head->value << " ";
    printInorder1(head->right);
}

// 后序遍历
void printPostorder1(TreeNode* head){
    if (head == nullptr){
        return;
    }
    printPostorder1(head->left);
    printPostorder1(head->right);
    cout << head->value << " ";
}

非递归版的三种遍历
先序遍历

// 迭代版
void printPreorder2(TreeNode* head){
    cout << "Pre Order:" << endl;
    if (head != nullptr){
        stack<TreeNode*> *sta = new stack<TreeNode*>;
        sta->push(head);
        TreeNode* cur = head;
        while(!sta->empty()){
            cur = sta->top();
            sta->pop();
            cout << cur->value << " ";
            if (cur->right != nullptr){
                sta->push(cur->right);
            }
            if (cur->left != nullptr){
                sta->push(cur->left);     // 先压右边节点,再压左边节点,这与栈的特性有关
            }
        }
    }
    cout << endl;
}

中序

void printInorder2(TreeNode* head){
     cout << "In Order:" << endl;
     if(head != nullptr){
         stack<TreeNode*>* sta = new stack<TreeNode*>;
         TreeNode* cur = head;
         while(!sta->empty() || cur != nullptr){
             if(cur != nullptr){
                sta->push(cur);
                cur = cur->left;
             }else{
                cur = sta->top();
                sta->pop();
                cout << cur->value << " ";
                cur = cur->right;
             }
         }
     }
     cout << endl;
}

后序

void printPostorder2(TreeNode* head){
    cout << "Post Order:" << endl;
    if (head != nullptr){
        stack<TreeNode*>* sta1 = new stack<TreeNode*>;
        stack<TreeNode*>* sta2 = new stack<TreeNode*>;
        TreeNode* cur = head;
        sta1->push(cur);
        while(!sta1->empty()){
            cur = sta1->top();
            sta1->pop();      // 弹出的是最晚被压入栈的数据
            sta2->push(cur);
            if(cur->left != nullptr){
                sta1->push(cur->left);
            }
            if(cur->right != nullptr){
                sta1->push(cur->right);
            }
        }
        while(!sta2->empty()){
            cur = sta2->top();
            sta2->pop();
            cout << cur->value << " ";
        }
    }
    cout << endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值