首页 > 其他分享 >二叉树应用题

二叉树应用题

时间:2022-08-21 23:14:02浏览次数:71  
标签:preorder right 应用题 inorder 遍历 二叉树 root left

1. 非递归先序

vector<int> preorderTraversal(TreeNode* root) {
    vector<int> nums;
    stack<TreeNode*> s;
    while(root||!s.empty()){
        if(root){
            nums.push_back(root->val);//输出
            s.push(root);//入栈
            root = root->left;//往左走
        }
        else{
            root = s.top();s.pop();//出栈
            root = root->right;//往右走
        }
    }
    return nums;
}

2. 非递归中序

vector<int> inorderTraversal(TreeNode* root) {
    vector<int> nums;
    stack<TreeNode*> s;
    while(root||!s.empty()){
        if(root){
            s.push(root);//入栈
            root = root->left;//往左走
        }
        else{
            root = s.top();s.pop();//出栈
            nums.push_back(root->val);//输出
            root = root->right;//往右走
        }
    }
    return nums;
}

3. 非递归后序

需要使用辅助指针进行判断

vector<int> postorderTraversal(TreeNode* root) {
    vector<int> nums;
    stack<TreeNode*> s;
    TreeNode* r;//辅助判断指针,判断是从左子树出栈,还是右子树
    while(root||!s.empty()){
        if(root){
            s.push(root);//入栈
            root = root->left;//往左走
        }
        else{
            root = s.top();//得到栈顶
            if(root->right&&root->right!=r)//右子树存在,且不是刚出来
                root = root->right;//往右走
            else{
                s.pop();//出栈
                nums.push_back(root->val);//输出
                r = root;//记录最近访问
                root = NULL;//重置指针
            }
        }
    }
    return nums;
}

4. 自下而上、自右而左的层次遍历

使用队列和栈

void InvertLevel(TreeNode* root) {
    queue<TreeNode*> q;
    stack<int> s;
    q.push(root);
    while(!q.empty()){
        TreeNode* p = q.front();
        q.pop();
        s.push(p->val);
        if(p->left) q.push(p->left);
        if(p->right) q.push(p->right);
    }
    while(!s.empty()){
        cout<<s.top();//逆序输出
        s.pop();
    }
}

5. 非递归求高度(层次遍历)

6. 先序、中序构建二叉树

 TreeNode* myBuildTree(vector<int>& preorder, vector<int>& inorder, int preorder_left, int preorder_right, int inorder_left, int inorder_right) {
        if (preorder_left > preorder_right) return nullptr;
        int inorder_root = index[preorder[preorder_left]];// 在中序遍历中定位根节点,这里使用哈希优化,也可以遍历中序序列找根节点
        // 先把根节点建立出来
        TreeNode* root = new TreeNode(preorder[preorder_left]);
        // 得到左子树中的节点数目
        int size_left_subtree = inorder_root - inorder_left;
        root->left = myBuildTree(preorder, inorder, preorder_left + 1, preorder_left + size_left_subtree, inorder_left, inorder_root - 1);
        root->right = myBuildTree(preorder, inorder, preorder_left + size_left_subtree + 1, preorder_right, inorder_root + 1, inorder_right);
        return root;
    }

7. 判断完全二叉树

借助队列,遇到空节点时,查看其后是否有非空节点

8. 计算度为2的节点

//递归

9. 交换左右子树

//递归

10. 找先序遍历第k个值

//全局变量递归

11. 删除指定的子树

12. 找指定值节点的所有祖先

//非递归后序遍历,访问到指定节点时,栈中所有元素皆为祖先

13. 两节点最近公共祖先

//非递归后序遍历

14. 二叉树的宽度

//层次遍历

15. 满二叉树先序转后序

16. 链表串联叶子节点

//记录全局变量pre和首个叶子节点,以任一种方式递归遍历

17. 判断相似

//递归判断

18.

19. 求带权路径长度

//先序遍历,累积求路径长度,递归时更新传入深度

20. 输出中缀表达式

//中序遍历

标签:preorder,right,应用题,inorder,遍历,二叉树,root,left
From: https://www.cnblogs.com/929code/p/16611349.html

相关文章

  • 二叉树遍历方法总结
    二叉树基本概念面试的时候提到的树,大部分都是二叉树.所谓二叉树是树的一种特殊结构,在二叉树中每个节点最多只能有两个子节点,在二叉树中最重要的操作莫过于遍历,即......
  • 数据结构3-二叉树
    二叉树概念  二叉树分类  二叉树遍历方式 ......
  • 102.binary-tree-level-order-traversal 二叉树的层序遍历
    利用queue先进先出的特性进行处理,利用queue.size()来识别元素是否在二叉树的同一层,同时要注意不能直接i<q.size()来判断,因为q.size()是不断变化的。classSolution{......
  • 107.binary-tree-level-order-traversal-ii 二叉树的层序遍历II
    参考102.binary-tree-level-order-traversal二叉树的层序遍历,翻转一下结果数组就好了。classSolution{public:vector<vector<int>>levelOrderBottom(TreeNode......
  • 【数据结构】红黑树与平衡二叉树的区别以及原理详解(附图解)
    引用网址:https://blog.csdn.net/weixin_44780082/article/details/112239269文章目录前言一、什么是红黑树1.1平衡二叉树1.2红黑树1.3平衡二叉树和红黑树的区别二、红黑......
  • 二叉树的统一迭代法遍历
    中序遍历中序遍历无法直接利用栈进行遍历,需要利用指针进行遍历,对栈中的节点进行操作。对于中间节点,如果指针遍历到了,但没有进行处理,就再push()一个nullptr,作为标记,说明这......
  • 链表应用题
    1.递归删除指定值(无头结点)voidDel(ListNode*L,intval){ListNode*p;//指向被删除节点if(L==NULL)return;//递归边界if(L->val==val){//处理首指针......
  • 顺序表应用题
    1.删除返回最小值并由最后元素填补boolDel_Min(vector<int>&nums,int&val){if(nums.size()==0)returnfalse;intpos=0;//假定0号元素最小for(int......
  • 二叉树 查找第k大的数
    改造方法需在节点N中记录以节点N为根的子树的节点数numOfNodes,根节点记录整颗树的节点数目,则若根节点的左子树的numOfNodes刚好为k-1,那这个根节点的值即为目标值。注意......
  • 2022-8-20 每日一题-二叉树-递归
    654.最大二叉树难度中等499收藏分享切换为英文接收动态反馈给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:创建一个......