Coing-二叉树(bibary Tree)

本文详细介绍了二叉树的相关概念和经典问题,包括二叉树的遍历(层次、前序、中序、后序及Z型遍历)、平衡二叉树的判断、前序遍历的第k个结点、对角线遍历、构造二叉树以及对称二叉树的判断。通过这些题目和扩展,帮助读者深入理解二叉树的性质和操作。
摘要由CSDN通过智能技术生成

二叉树(bibary Tree)

二叉树是面试中最容易被问道的问题,这里同样给出高频而且有代表性的10道题目。
二叉树介绍:

  1. 百度百科:二叉树
  2. wikipedia: binary Tree

定义二叉树:

struct TreeNode {
    int data;
    TreeNode *left, *right;
    TreeNode(){}
    TreeNode(int _data, TreeNode* _left, TreeNode* _right):data(_data), left(_left), right(_right){}
};

1. 二叉树的遍历

题目: 给出二叉树的层次遍历, 前序, 中序, 后序 遍历.
扩展: 前序遍历的迭代形式,希望大家自行手写中序和后序的迭代代码, 很多公司会问道非递归代码.

// 前序遍历
void printPostorder(struct TreeNode* node) { 
    if (node == NULL) 
        return;   
    printPostorder(node->left); 
    printPostorder(node->right);   
    cout << node->data << " "; 
} 
// 中序遍历  
void printInorder(struct TreeNode* node) { 
    if (node == NULL) 
        return; 
    printInorder(node->left);   
    cout << node->data << " ";   
    printInorder(node->right); 
} 
// 后序遍历  
void printPreorder(struct TreeNode* node) { 
    if (node == NULL) 
        return; 
    cout << node->data << " "; 
    printPreorder(node->left);  
    printPreorder(node->right); 
}  

// 层次遍历 
void printLevelOrder(struct TreeNode* node) {
    queue<TreeNode *> q;
    if(!node) q.push(node);
    while(!q.empty()) {
        // 当前的长度是上一层的个数,这一点很重要,可以解决很多层次遍历相关的问题
        int len = q.size(); 
        for(int i = 0; i < len; i ++) {
            TreeNode * tmp = q.top();
            q.pop();
            cout << tmp->data << " ";
            if(tmp->left) q.push(tmp->left);
            if(tmp->right) q.push(tmp->right);
        }
    } 
}

// 迭代的前序遍历, root left right
void iterativePreorder(struct TreeNode *root) {
    if(root == NULL) return;
    stack<TreeNode *> sta;
    sta.push(root);
    while(!sta.empty()) {
        // 注意先进后出, 所以先right后left
        TreeNode * tmp = sta.top();
        sta.pop();
        cout << tmp->data << " ";
        if(tmp->right) sta.push(tmp->right);
        if(tmp->left) sta.push(tmp->left);
    }
}

2. 二叉树的Z型遍历

题目: 二叉树的Z型遍历.
扩展: 层次遍历的从下到上遍历, 层次遍历的奇数层遍历, 层次遍历的从右到左遍历等,都可以使用这个代码进行变形

/***
    3
   / \
  9  20
    /  \
   15   7
Z型遍历: 3, 20, 9, 15, 7
**/
vector<in
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值