导航:首页 > 源码编译 > 遍历二叉树算法

遍历二叉树算法

发布时间:2022-01-24 04:27:17

1. 二叉树的遍历

1.遍历方案 从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部分组成。因此,在任一给定结点上,可以按某种次序执行三个操作: (1)访问结点本身(N), (2)遍历该结点的左子树(L), (3)遍历该结点的右子树(R)。以上三种操作有六种执行次序: NLR、LNR、LRN、NRL、RNL、RLN。 注意: 前三种次序与后三种次序对称,故只讨论先左后右的前三种次序。 2.三种遍历的命名 根据访问结点操作发生位置命名: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(PostorderTraversal) ——访问结点的操作发生在遍历其左右子树之后。 注意: 由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtlee)和R(Right subtree)又可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。 遍历算法 1.中序遍历的递归算法定义: 若二叉树非空,则依次执行如下操作: (1)遍历左子树; (2)访问根结点; (3)遍历右子树。 2.先序遍历的递归算法定义: 若二叉树非空,则依次执行如下操作: (1) 访问根结点; (2) 遍历左子树; (3) 遍历右子树。 3.后序遍历得递归算法定义: 若二叉树非空,则依次执行如下操作: (1)遍历左子树; (2)遍历右子树; (3)访问根结点。 ~

2. 二叉树遍历

......1
..../....\
..2.......3
./....../...\
4......5.....6
........\
.........7

根结点为1,则左为42,右5736,再看先根序列24 3576;
左边42在先根序列中以2为先,则1的下一层为2,再看中根序列42,所以4在2的右边;
右边5736在先根序列中以3为先,则3的左边是57,右边是6;
在先根序列中5先于7,在中根序列中7在5的右边;

据此可作上图

再由上图写出后根序列:4275631

答案为:B

3. 最简单的二叉树遍历

前序就是先根再左再右,后序就是先左再右再根,看书去理解就行,这名字肯定取得跟方法有关系,还是很好理解的。

4. c++二叉树的几种遍历算法

遍历二叉树的所有结点且仅访问一次。按照根节点位置的不同分为前序遍历,中序遍历,后序遍历(除此之外还有层次遍历,但不常用,此处不做解释)。

1.前序遍历:根节点->左子树->右子树(根节点在前面)。

2.中序遍历:左子树->根节点->右子树(根节点在中间)。

3.后序遍历:左子树->右子树->根节点(根节点在后边)。

例如:求下面树的三种遍历:

前序遍历:abdefgc;

中序遍历:debgfac;

后序遍历:edgfbca。

5. 先序遍历二叉树的递归算法怎样理解(严蔚敏主编)

先序调用的时候,递归函数,先序函数会一直递归,直到t->next为空,即t为叶节点,需要注意的是当t->next 为空时,函数的实参没有传过去,所以t指向叶结点的父节点,更要注意的是,先序调用的递归函数还没执行完,在先序调用的最里层,要执行这个函数的最后一个语句,即先序访问右子树。
在了解递归函数时,要注意函数是一层一层执行的,把没有调用的函数看作哦是第一层,第一次调用的时候,,势必会第二次遇到调用函数,变成第二层,,,,

6. 遍历二叉树递归算法

“这个函数的参数visit应该是另一个函数的地址是把,但我怎么感觉不管怎么递归它只是在访问根的时候被调用过一次”
首先,你是对的,visit确实是一个指向函数的指针;
然后,它只是在访问根的时候被调用过一次,这种说法就很片面了。
我觉得应该这么说:(*visit)()函数在BTreePreOrger()函数的一次执行过程中只被调用过一次,但是BTreePreOrger()函数执行了很多次,因此(*visit)()就被调用了n次(假设该树有n个节点)

7. 二叉树遍历的算法实现

从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部分组成。因此,在任一给定结点上,可以按某种次序执行三个操作:
⑴访问结点本身(N),
⑵遍历该结点的左子树(L),
⑶遍历该结点的右子树(R)。
以上三种操作有六种执行次序:
NLR、LNR、LRN、NRL、RNL、RLN。
注意:
前三种次序与后三种次序对称,故只讨论先左后右的前三种次序。 根据访问结点操作发生位置命名:
① NLR:前序遍历(PreorderTraversal亦称(先序遍历))
——访问根结点的操作发生在遍历其左右子树之前。
② LNR:中序遍历(InorderTraversal)
——访问根结点的操作发生在遍历其左右子树之中(间)。
③ LRN:后序遍历(PostorderTraversal)
——访问根结点的操作发生在遍历其左右子树之后。
注意:
由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtree)和R(Right subtree)又可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。 1.先(根)序遍历的递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴ 访问根结点;
⑵ 遍历左子树;
⑶ 遍历右子树。
2.中(根)序遍历的递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴遍历左子树;
⑵访问根结点;
⑶遍历右子树。
3.后(根)序遍历得递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴遍历左子树;
⑵遍历右子树;
⑶访问根结点。 用二叉链表做为存储结构,中序遍历算法可描述为:
void InOrder(BinTree T)
{ //算法里①~⑥是为了说明执行过程加入的标号
① if(T) { // 如果二叉树非空
② InOrder(T->lchild);
③ printf(%c,T->data); // 访问结点
④ InOrder(T->rchild);
⑤ }
⑥ } // InOrder 计算中序遍历拥有比较简单直观的投影法,如图
⑴在搜索路线中,若访问结点均是第一次经过结点时进行的,则是前序遍历;若访问结点均是在第二次(或第三次)经过结点时进行的,则是中序遍历(或后序遍历)。只要将搜索路线上所有在第一次、第二次和第三次经过的结点分别列表,即可分别得到该二叉树的前序序列、中序序列和后序序列。
⑵上述三种序列都是线性序列,有且仅有一个开始结点和一个终端结点,其余结点都有且仅有一个前驱结点和一个后继结点。为了区别于树形结构中前驱(即双亲)结点和后继(即孩子)结点的概念,对上述三种线性序列,要在某结点的前驱和后继之前冠以其遍历次序名称。
【例】上图所示的二叉树中结点C,其前序前驱结点是D,前序后继结点是E;中序前驱结点是E,中序后继结点是F;后序前驱结点是F,后序后继结点是A。但是就该树的逻辑结构而言,C的前驱结点是A,后继结点是E和F。
二叉链表基本思想
基于先序遍历的构造,即以二叉树的先序序列为输入构造。
注意:
先序序列中必须加入虚结点以示空指针的位置。
【例】
建立上图所示二叉树,其输入的先序序列是:ABD∮∮∮CE∮∮F∮∮。
构造算法
假设虚结点输入时以空格字符表示,相应的构造算法为:
void CreateBinTree (BinTree **T){ //构造二叉链表。T是指向根指针的指针,故修改*T就修改了实参(根指针)本身 char ch; if((ch=getchar())=='') *T=NULL; //读入空格,将相应指针置空 else{ //读人非空格 *T=(BinTNode *)malloc(sizeof(BinTNode)); //生成结点 (*T)->data=ch; CreateBinTree(&(*T)->lchild); //构造左子树 CreateBinTree(&(*T)->rchild); //构造右子树 }}
注意:
调用该算法时,应将待建立的二叉链表的根指针的地址作为实参。
示例
设root是一根指针(即它的类型是BinTree),则调用CreateBinTree(&root)后root就指向了已构造好的二叉链表的根结点。
二叉树建立过程见
下面是关于二叉树的遍历、查找、删除、更新数据的代码(递归算法): #include<iostream>#include<cstdio>#include<cmath>#include<iomanip>#include<cstdlib>#include<ctime>#include<algorithm>#include<cstring>#include<string>#include<vector>#include<list>#include<stack>#include<queue>#include<map>#include<set>usingnamespacestd;typedefintT;classbst{structNode{Tdata;Node*L;Node*R;Node(constT&d,Node*lp=NULL,Node*rp=NULL):data(d),L(lp),R(rp){}};Node*root;intnum;public:bst():root(NULL),num(0){}voidclear(Node*t){if(t==NULL)return;clear(t->L);clear(t->R);deletet;}~bst(){clear(root);}voidclear(){clear(root);num=0;root=NULL;}boolempty(){returnroot==NULL;}intsize(){returnnum;}TgetRoot(){if(empty())throwemptytree;returnroot->data;}voidtravel(Node*tree){if(tree==NULL)return;travel(tree->L);cout<<tree->data<<'';travel(tree->R);}voidtravel(){travel(root);cout<<endl;}intheight(Node*tree){if(tree==NULL)return0;intlh=height(tree->L);intrh=height(tree->R);return1+(lh>rh?lh:rh);}intheight(){returnheight(root);}voidinsert(Node*&tree,constT&d){if(tree==NULL)tree=newNode(d);elseif(ddata)insert(tree->L,d);elseinsert(tree->R,d);}voidinsert(constT&d){insert(root,d);num++;}Node*&find(Node*&tree,constT&d){if(tree==NULL)returntree;if(tree->data==d)returntree;if(ddata)returnfind(tree->L,d);elsereturnfind(tree->R,d);}boolfind(constT&d){returnfind(root,d)!=NULL;}boolerase(constT&d){Node*&pt=find(root,d);if(pt==NULL)returnfalse;combine(pt->L,pt->R);Node*p=pt;pt=pt->R;deletep;num--;returntrue;}voidcombine(Node*lc,Node*&rc){if(lc==NULL)return;if(rc==NULL)rc=lc;elsecombine(lc,rc->L);}boolupdate(constT&od,constT&nd){Node*p=find(root,od);if(p==NULL)returnfalse;erase(od);insert(nd);returntrue;}};intmain(){bstb;cout<<inputsomeintegers:;for(;;){intn;cin>>n;b.insert(n);if(cin.peek()==' ')break;}for(;;){cout<<inputdatapair:;intod,nd;cin>>od>>nd;if(od==-1&&nd==-1)break;b.update(od,nd);}}

8. 二叉树的遍历算法

怎么又来问了,不是回答过你了吗?很简单,就是一个递归过程。在函数中以先序遍历的第一个结点在中序遍历中为界把中序遍历分为两半,再分别把左一半和右一半作为这个结点的左子树和右子树进行递归。完成递归之后再打印该结点即可。结束递归的条件是左子树或右子树没有结点。下面是简单的程序示意,可以用任意语言实现。

不过你给出的这个前序遍历和中序遍历却是有问题的,如果改成ABDEGCFH和DBGEAFCH的话其后序遍历就是:D G E B F H C A

import sys

rflist = list(sys.argv[1])
rmlist = list(sys.argv[2])

def printTreeRootLast(r, rflist, rmlist):
r[0] = rflist.pop(0)

rmLeftNodes = rmlist[:rmlist.index(r[0])]
if len(rmLeftNodes) == 0:
r[1] = None
else:
r[1] = [None, None, None]
printTreeRootLast(r[1], rflist, rmLeftNodes)

rmRightNodes = rmlist[rmlist.index(r[0])+1:]
if len(rmRightNodes) == 0:
r[2] = None
else:
r[2] = [None, None, None]
printTreeRootLast(r[2], rflist, rmRightNodes)

print r[0],

root = [None, None, None]
printTreeRootLast(root, rflist, rmlist)

9. 求二叉树遍历算法C语言实现的

Status
PreOrderTraverse
(
BiTree
T,
Status
(
*Visit
)
(
TElemType
e
)
)
{
//
采用二叉链表存储结构,Visit
是对数据元素操作的应用函数,先序遍历二叉树
T
的递归算法。
if
(
T
)
{
//

T
不为空
if
(
Visit
(
T->data
)
)
//
调用函数
Visit
if
(
PreOrderTraverse
(
T->lchild,
Visit
)
)
//
递归调用左子树
if
(
PreOrderTraverse
(
T->rchild,
Visit
)
)
return
OK;
//
递归调用右子树
return
ERROR;
}
else
return
OK;
}
//
PreOrderTraverse

阅读全文

与遍历二叉树算法相关的资料

热点内容
服务器一直崩应该用什么指令 浏览:916
cm202贴片机编程 浏览:724
php构造函数带参数 浏览:175
解压电波歌曲大全 浏览:336
为啥文件夹移到桌面成word了 浏览:858
命令符的安全模式是哪个键 浏览:758
编程中学 浏览:956
单片机求助 浏览:993
ug加工侧面排铣毛坯怎么编程 浏览:271
程序员有关的介绍 浏览:736
支付宝使用的什么服务器 浏览:210
安卓看本地书用什么软件好 浏览:921
经传软件滚动净利润指标源码 浏览:522
萤石云视频已加密怎么解除 浏览:574
一命令四要求五建议 浏览:30
qq文件夹迁移不了 浏览:19
液体粘滞系数测定不确定度算法 浏览:332
轻栈源码 浏览:426
把图片压缩到500k 浏览:35
命令你自己 浏览:369