剑指offer32. 从上到下打印二叉树 P171(三种层次遍历的要求)

剑指offer32. 从上到下打印二叉树 P171(三种层次遍历的要求)

1. 不分(换)行,从上到下打印二叉树

原始的层次遍历

void  PrintFromTopToBottom1(BinaryTreeNode *pRoot) {  // 不分行层次打印 
	if (pRoot == NULL) return;
	queue<BinaryTreeNode* > q;
	q.push(pRoot);
	while (!q.empty()) {                        // 层次遍历
		BinaryTreeNode *p = q.front();
		q.pop();
		printf("%d ", p -> m_nValue);
		if (p -> m_pLeft) q.push(p -> m_pLeft);
		if (p -> m_pRight) q.push(p -> m_pRight);
	}
} 

2. 分行(层)打印二叉树

两个变量分别存当前行的节点个数,和下一行节点个数

void  PrintFromTopToBottom2(BinaryTreeNode *pRoot) {    // 分行层次打印 
	if (pRoot == NULL) return;
	queue<BinaryTreeNode* > q;
	q.push(pRoot);
    int currentLayCount = 1, nextLayCount = 1;   // 分别存当前行和下一行的节点数 
	while (!q.empty()) {
		currentLayCount = nextLayCount;      //  每一次打印一行时,更新两个变量
		nextLayCount = 0;
		while (currentLayCount > 0) {           //  打印当前行
			BinaryTreeNode *p = q.front();
			q.pop();
			printf("%d ", p -> m_nValue);
			if (p -> m_pLeft) {
				q.push(p -> m_pLeft);
				nextLayCount++;      
			} 
			if (p -> m_pRight)  {
				q.push(p -> m_pRight);
				nextLayCount++;
			}
			--currentLayCount;
		}
        printf("\n");         
    }     
 }

3 .之字形打印二叉树

题目:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印 其他行以此类推。

用两个栈交替存当前行和下一行,偶数行的子节点从左往右入栈(保证下一行从右到左输出),奇数行的与之相反。

void  PrintFromTopToBottom(BinaryTreeNode *pRoot) {   // 之字型打印二叉树 
	if (pRoot == NULL) return;
	stack<BinaryTreeNode* > s[2];    //两个辅助栈,0代表偶数行,(省去判奇偶的操作)
	int  current = 0, next = 1;       // 当前和下一行要访问的栈是s[0]还是s[1] 
	s[0].push(pRoot);              // 默认根节点是偶数行

	while (!s[0].empty() || !s[1].empty()) {
			BinaryTreeNode *node =  s[current].top();   // 当前栈出栈
			s[current].pop();
			printf("%d ", node -> m_nValue);

            if (current == 0) {                   // 0栈是正向,从左到右入栈
            	if (node -> m_pLeft) {
		        	s[next].push(node -> m_pLeft);
	    		} 
		    	if (node -> m_pRight)  {
			        s[next].push(node -> m_pRight);
		    	}
            } else {                           // 1栈是反向 从右到左入栈
				if (node -> m_pRight)  {
			        s[next].push(node -> m_pRight);
		    	}
            	if (node -> m_pLeft) {
		        	s[next].push(node -> m_pLeft);
	    		} 
            }
            if (s[current].empty()) {              // 一行打印结束,(写的真好)
            	current = 1 - current;          //  奇偶互换
            	next = 1 - next;
            	printf("\n");
            }
	    	
		}
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值