大家好,感谢邀请,今天来为大家分享一下深入探讨二叉树的遍历算法与实现的问题,以及和的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!
整数值;
BSTreeNode *左;
BSTreeNode *右;
BSTreeNode(int x=0) : val(x), 左(nullptr), 右(nullptr) { }
};前序、中序、后序遍历过程:遍历过程经过同一路线的节点,但访问每个节点的时机不同。每个节点会遍历3次,第一次打印前序遍历,第二次打印中序遍历,第三次打印后序遍历。
Traversal.jpg
递归遍历
前序递归遍历void BSTree:_preOrder(BSTreeNodePtr x, std:functionfunc)
{
if (x==nullptr)
返回;
函数(x);
_preOrder(x-left, func);
_preOrder(x-right, func);
}中序递归遍历void BSTree:_inOrder(BSTreeNodePtr x, std:functionfunc)
{
if (x==nullptr)
返回;
_inOrder(x-left, func);
函数(x);
_inOrder(x-right, func);
}后序递归遍历void BSTree:_postOrder(BSTreeNodePtr x, std:functionfunc)
{
if (x==nullptr)
返回;
_postOrder(x-left, func);
_postOrder(x-right, func);
函数(x);
}
非递归遍历
前序非递归遍历
void BSTree:_preorderWithNonRecursion(BSTreeNodePtr x, std:functionfunc)
{
std:stackstack_;
while(!stack_.empty() || x)
{
同时(x)
{
函数(x);
stack_.push(x);
x=x-左;
}
if (!stack_.empty())
{
x=stack_.top();
stack_.pop();
x=x-右;
}
}
}中序非递归遍历
当遇到一个节点时,将其压入堆栈并遍历其左子树。当其左子树遍历完毕后,将节点从栈顶弹出并访问,然后根据右指针按中序遍历该节点。点的右子树
void BSTree:_inOrderWithNonRecursion(BSTreeNodePtr x, std:functionfunc)
{
std:stackstack_;
while(!stack_.empty() || x)
{
同时(x)
{
stack_.push(x);
x=x-左;
} //左子树遍历结束
if (!stack_.empty())
{
x=stack_.top();
stack_.pop();
函数(x); //从栈顶弹出节点并访问它
x=x-右; //中序遍历该节点的右子树
}
【深入探讨二叉树的遍历算法与实现】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
我还在学习数据结构,二叉树真的挺有用的。
有10位网友表示赞同!
这个话题感觉和编程很相关啊。
有20位网友表示赞同!
之前看过关于二叉树的文章,不过现在想回顾一下它的遍历方法。
有11位网友表示赞同!
明白二叉树的遍历方式对解决一些算法问题很有帮助。
有16位网友表示赞同!
我想了解不同遍历方式的优缺点,什么时候用哪种方法比较好。
有11位网友表示赞同!
这个题目听起来有点复杂,需要好好研究一下才行。
有17位网友表示赞同!
二叉树是计算机科学基础知识吧?
有8位网友表示赞同!
期待学习到新的算法和技巧。
有14位网友表示赞同!
感觉遍历二叉树可以用于很多实际应用场景呢。
有7位网友表示赞同!
好像有很多种二叉树的遍历方法,需要了解哪些最常见的那种。
有20位网友表示赞同!
最近在刷菜鸡题,应该会有涉及二叉树的遍历问题吧?
有19位网友表示赞同!
如果能有一个图示来讲解二叉树的遍历那就更好了。
有15位网友表示赞同!
二叉树的遍历是计算机基础吧,感觉很有用。
有9位网友表示赞同!
这个题目的难度应该中等复杂度吧?
有15位网友表示赞同!
学习算法肯定要学习二叉树这个结构和它的遍历方法。
有9位网友表示赞同!
以前没太重视数据结构,现在想想还是应该好好学一学。
有13位网友表示赞同!
想通过这篇文章深入理解二叉树的遍历概念。
有20位网友表示赞同!
这个话题对于从事软件开发的人来说非常重要。
有20位网友表示赞同!
希望能够学习到一些实用性的知识和技巧。
有12位网友表示赞同!