二叉树基本操作

Posted jiaxblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树基本操作相关的知识,希望对你有一定的参考价值。

广度优先搜索

1、把根节点入队列;
2、如果队列非空,出队,再依次将左子树入队、右子树入队;
3、重复步骤2,直到队列为空。

void BreadFirstSearch(TreeNode *root){
    if(root == NULL)
        return;
    queue<TreeNode*> q;
    q.push(root);
    TreeNode* node;
    while(!q.empty()){
        node = q.front();
        cout << node->val << " ";
        q.pop();
        if(node->left)
            q.push(node->left);
        if(node->right)
            q.push(node->right);
    }
}

深度优先搜索

1、把根节点入栈;
2、如果栈非空,则出栈,再依次将右子树入栈、左子树入栈;
3、重复步骤2,直到栈为空。

void DepthFirtstSearch(TreeNode* root){
    if(root == NULL)
        return;
    stack<TreeNode*> ss;
    ss.push(root);
    TreeNode* node;
    while(!ss.empty()){
        node = ss.top();
        cout << ss->val << " ";
        ss.pop();
        if(node->right)
            ss.push(node->right);
        if(node->left)
            ss.push(node->left);
    }
}

二叉树镜像

技术分享图片

方法1:递归实现,先把根节点的左右子树交换,再对左子树、右子树进行同样的操作。

class Solution {
public:
    void Mirror(TreeNode *pRoot) {
        if(pRoot == NULL)
            return;
        TreeNode *temp;
        temp = pRoot->left;
        pRoot->left = pRoot->right;
        pRoot->right = temp;
        Mirror(pRoot->left);
        Mirror(pRoot->right);
    }
};

方法2:非递归,既可以用队列辅助,也可以用栈辅助。如果用队列,先把根节点的左右子树交换,然后把左右子树入队列,每次取出队首元素,交换左右子树,直到队列为空。

class Solution {
public:
    void Mirror(TreeNode *pRoot) {
        if(pRoot == NULL)
            return;
        queue<TreeNode*> qq;
        qq.push(pRoot);
        TreeNode *node, *temp;
        while(!qq.empty()){
            node = qq.front();
            temp = node->left;
            node->left = node->right;
            node->right = temp;
            qq.pop();
            if(node->left)
                qq.push(node->left);
            if(node->right)
                qq.push(node->right);
        }
    }
};

如果用栈,则先把根节点的左右子树交换,然后把左右子树分别入栈,每次取栈顶元素,交换左右子树,直到栈为空。

class Solution {
public:
    void Mirror(TreeNode *pRoot) {
        if(pRoot == NULL)
            return;
        stack<TreeNode*> ss;
        TreeNode *node, *temp;
        ss.push(pRoot);
        while(!ss.empty()){
            node = ss.top();
            ss.pop();
            temp = node->left;
            node->left = node->right;
            node->right = temp;
            if(node->left)
                ss.push(node->left);
            if(node->right)
                ss.push(node->right);
        }
    }
};




以上是关于二叉树基本操作的主要内容,如果未能解决你的问题,请参考以下文章

C站万字详解二叉树基本操作演示程序(附图)

二叉树基本操作方法的递归调用实现

数据机构实验报告-实验三 二叉树基本操作的实现

二叉树基本操作

两万字硬核解析树与二叉树所有基本操作(包含堆,链式二叉树基本操作及测试代码,和递归函数的书写方法)

二叉树二叉树基本操作通用接口