zl程序教程

您现在的位置是:首页 >  后端

当前栏目

遍历二叉树的代码实现

2023-09-27 14:25:57 时间
BiTree p = T; //p为遍历二叉树的指针 while(p || !IsEmpty(S)){ //二叉树不为空或栈不空是继续循环 if(p != NULL){ vist(p) //访问拍p Push(S,p); //p节点入栈 p = p- lchild; //继续向左遍历 else{ Pop(S,p); //p出栈 p = p- rchild; //转向右子树遍历 }中序遍历(左--根--右)递归法
void InOrder(BiTree T){

 if(T != NULL){

 InOrder(T- lchild); //递归遍历左子树

 visit(T); //访问根节点

 InOrder(T- rchild); //递归遍历右子树

}
非递归法
void InOrder(BiTree T){

 InitStack(S); //使用栈存储二叉树的节点

 BiTree p = T; //p为遍历二叉树的指针

 while(p || !IsEmpty(S)){ //二叉树不为空或栈不空是继续循环

 if(p != NULL){

 Push(S,p); //p节点入栈

 p = p- lchild; //继续向左遍历

 else{

 Pop(S,p); //p出栈

 visit(p); //访问p

 p = p- rchild; //转向右子树遍历

}
后序遍历(左--右--根)递归法
void PostOrder(BiTree T){

 if(T != NULL){

 PostOrder(T- lchild); //递归遍历左子树

 PostOrder(T- rchild); //递归遍历右子树

 visit(T); //访问根节点

}
非递归法
void PostOrder(BiTree T){

 InitStack(S); //使用栈存储二叉树的节点

 BiTree p = T; //p为遍历二叉树的指针

 BiTree r = NULL; //记录最近访问的节点

 while(p || !IsEmpty(S)){ //二叉树不为空或栈不空是继续循环

 if(p != NULL){

 Push(S,p); //p节点入栈

 p = p- lchild; //继续向左遍历

 else{

 GetTop(S,p); //读取栈顶节点,不出栈

 if(p- rchild p- rchild != r){ //右子树存在,且未被访问

 p = p- rchild;

 Push(S,p); //p节点入栈

 p = p- lchild; //转左遍历

 else{

 Pop(S,p); //p出栈

 visit(p); //访问p

 r = p; //记录最近一次访问的节点

 p = NULL;

}
层序遍历
void LevelOrder(BiTree T){

 InitQueue(Q); //使用队列存储二叉树节点

 BiTree p;

 EnQueue(Q,T); //根节点入队

 while(!IsEmpty(Q)){ //队列不空继续循环

 DeQueue(Q,p); //队头节点出队

 vist(p); //访问队头节点

 if(p- lchild != NULL){

 EnQueue(Q,p- lchild); //左孩子入队

 if(p- rchild != NULL){

 EnQueue(Q,p- rchild); //右孩子入队

}

树的子结构(剑指offer 26)Java先序遍历+子结构判断 输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现和B相同的结构和节点值。
(Java)构造二叉树OJ题(LeetCode105 根据前序与中序构造二叉树,LeetCode106 根据后序与中序构造二叉树) 从前序遍历可以得到根结点,从中序中可以得到跟结点的左右子树部分,我们在构造二叉树的时候是从前序找根,再在中序中找根的左右子树部分先创建根节点再分别创建跟的左子树与跟的右子树,这个过程是一个递归,每次递归都要确定在中序哪个区间找新的根。