首页 > 其他分享 >二叉树

二叉树

时间:2023-05-08 21:22:41浏览次数:44  
标签:node 结点 遍历 res 二叉树 root

树是有限个(n>0)元素组成的集合。

树中每个结点拥有的孩子结点的个数称为该结点的度,度为0的结点为叶子结点或终端结点。树的度是树中结点的度的最大值。在有序树中,孩子结点沿用左边大、右边小的原则。

二叉树是有限个(n>=0)结点的集合。可以为空,或者有一个结点作为根结点,其他结点分成左右两个互不相交的子集作为二叉树的左右子集。

从形式上看二叉树似乎是每个结点最多有两个孩子的树,但实际上,二叉树和树是两种完全不同的结构。树是实际存在的结构类型,而二叉树不是一棵特殊的树,更多的作为一种工具。二叉树中结点数可以为0,而树不可以为0;二叉树的左右孩子要明确的指出是右还是左。

 

 

遍历:之所以叫前序、中序、后序遍历,是因为根节点在前、中、后。

对于上面的二叉树,我们遍历有:

前序:F,B,A,D,C,E,G,I,H

中序:A,B,C,D,E,F,G,H,I

后序:A,C,E,D,B,H,I,G,F

删除节点时,删除过程按照后序遍历的顺序。删除一个节点时,先删除它的左节点和右节点,再删除节点本身。

后序遍历在数学表达式中应用广泛。

通过中序遍历,我们可以得到原式:4*(7-2)+5。但程序表达在处理时中序遍历并不容易,因为要区分优先级。我们可以通过后序遍历,使用栈来处理表达式。每遇到一个操作符,就从栈顶弹出两个元素,计算并将结果返回到栈中。

A.前序遍历

方法一:递归。

定义preorder(root)表示当前遍历到root节点的答案,首先将root节点的值输入答案,再调用preorder(root->left)来遍历左子树,preorder(root->right)来遍历右子树。

class Solution{
public:
    void preorder(TreeNode *root,vector<int> &res){
        if(root==nullptr) return;
        res.push_back(root->val);
        preorder(root->left,res);
        preorder(root->right,res);
    }
    vector<int> preorderTraversal(TreeNode *root){
        vector<int> res;
        preorder(root,res);
        return res;
    }
};

方法二:迭代

与递归不同的是,需要显示地将栈模拟出来,即给出入栈和出栈的部分。

class Solution{
public:
    //注意这里TreeNode后面*的位置,是与递归方法不一样的
    vector<int> preorderTraversal(TreeNode* root){
        vector<int> res;
        if(root==nullptr){
            return res;
        }
        stack<TreeNode*> stk;
        TreeNode* node =root;
        while(!stk.empty()||node!=nullptr){
            while(node!=nullptr){
                res.emplace_back(node->val);
                stk.emplace(node);
                node=node->left;
            }
            node=stk.top();
            stk.pop();
            node=node->right;
        }
        return res;
    }
};
        

 

标签:node,结点,遍历,res,二叉树,root
From: https://www.cnblogs.com/chordxx/p/17377922.html

相关文章

  • 二叉树的线索化与遍历
    废话不说,上代码l1packagedataSrtuct.TreeAlgorithm;23importcom.sun.source.tree.Tree;45publicclassThreadBinaryTree{6publicstaticvoidmain(String[]args){7TreeNode2root=newTreeNode2(1,"M");8......
  • 线索二叉树
    (39条消息)线索二叉树,画图教你秒懂线索二叉树(线索二叉树的建立和简单操作)逻辑代码分析_IC00的博客-CSDN博客摘自这位大佬的内容,感觉写的很不错......
  • C/C++二叉树应用[2023-05-08]
    C/C++二叉树应用[2023-05-08]湖南应用技术学院实验(训)报告课程名称 数据结构与算法 课程代码 221031203 成绩评定 学院 信息工程学院 专业 物联网工程 指导老师 聂作财学生姓名 xxxx 学号 xxxxx 班级 物联xxxx实验地点 实验日期 年月日小组成员 无实验类型 □验......
  • leetcode 101 对称二叉树 Simple
    题目给你一个二叉树的根节点root,检查它是否轴对称。输入:root=[1,2,2,3,4,4,3]输出:true输入:root=[1,2,2,null,3,null,3]输出:false题解考察二叉树的遍历,使用广度优先BFS方法.BFS的关键在于使用队列,遍历树时,读到的节点先入队,再出队,出队时读取值,放入结......
  • (第26章)LinuxC本质中链表、二叉树和哈希表
    文章目录一、单链表的结构决定只能出栈,入栈1.链表的结构2.链表与数组的区别3.单链表所有基本操作代码(1)链表的插入(2)链表的查找(3)链表的删除(3)遍历整个链表(4)销毁整个链表4.习题5.C++NULL指针二、双向链表结构决定可以出队和入队1.在上面的单项链表上改改,得到双向链表2.改进双向链表:新增......
  • 平衡二叉树
    classSolution{public:boolres=true;intdfs(TreeNode*root)//返回以root为根节点的子树深度{if(root==NULL)return0;intl=dfs(root->left),r=dfs(root->right);if(abs(l-r)>1)res=false;returnmax(l......
  • 线索二叉树
    线索二叉树为什么要研究线索二叉树?如何解决上面的问题?我们使用第三种方法二叉链表当中右很多空的指针域线索二叉树定义例子线索二叉树增设了这些指针之后,会难以区分是指向孩子的指针还是指向前驱结点或者后继结点的指针所以要加上两个标志域线索二叉树的结点结......
  • 计算二叉树深度
    解决思路如果是空树,则深度为0;否则,递归计算左子树的深度记为m,递归计算右子树的深度记为n,二叉树的深度则为m与n的较大者加1。intDepth(BiTreeT){if(T==NULL)return0;else{m=Depth(T->lchild);n=Depth(T->rchild);if(m>n)return(m+1);......
  • 二叉树全分析(超详细总结建议收藏)
    个人主页:【......
  • 二叉树的操作
    二叉树的操作二叉树的复制如果是空树,递归结束否则,申请新结点的空间,复制根结点递归复制左子树递归复制右子树代码实现#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<vector>#include<cstring>#include<unordered_se......