当前位置 博文首页 > xiexiexiexieqing的博客:二叉搜索树 中序遍历递归和非递归(c程

    xiexiexiexieqing的博客:二叉搜索树 中序遍历递归和非递归(c程

    作者:[db:作者] 时间:2021-07-17 19:17

    首先嘛 中序 的打印顺序是?左根右?的

    其实 中序 和先序的 方法大致相同

    所有对于

    递归

     //中序遍历 递归
    void print1(struct node*root)
    {
    	if(root!=NULL)
    	{
    		print1(root->left);  //用他的左边在调用方法  (左)
    		printf("%d\t",root->data);//打印            (根)
    		print1(root->right);  //用他的右边在调用方法 (右)
    	}
     }

    递归就是反复的调用自己的过程

    非递归

     //中序遍历 非递归
    void print(struct node*root)
    {
    	struct node*a[20];     //建立一个结构体数组 
    	struct node*pnode=root;  //然后定义一个结构体指针好做下面的操作 
    	int i=-1;
    	while(pnode||i!=-1)
    	{
    		while(pnode)   //当节点不为空 
    		{
    			a[++i]=pnode;    // 入栈
    			pnode=pnode->left;
    		}
    		if(i!=-1)      // 无路可走的时候 
    		{
    			pnode=a[i--];    //出栈 
    			printf("%d\t",pnode->data);  //打印 
    			pnode=pnode->right;
    		}
    	}
    }

    ?

    ?还是这个图

    • 50这个节点 入栈 向左 到30 这个节点
    • 重复这个动作一直到 最左边黑色(空)节点这里
    • 黑(空)节点 出栈 到20这个节点?并打印?
    • 判断当前节点(20)的右边为空嘛?? 出栈 打印 不为空移动

    ?

    cs