1.1按层打印二叉树

题目:

有一棵二叉树,请设计一个算法,按照层次打印这棵二叉树。

给定二叉树的根结点root,请返回打印结果,结果按照每一层一个数组进行储存,所有数组的顺序按照层数从上往下,且每一层的数组内元素按照从左往右排列。保证结点数小于等于500。

  按层打印二叉树的核心问题 在于  确保每一层都打印完再进行下一行的打印。 因为二叉树每个节点都有左右子树,所以判断依据是该 节点Node 是最右边即可知道每一层的结束

  

用一个队列来管理待打印节点

   核心在于出列后,判断节点左右有没有子树放入队列, last 和nlast 每次移动都会改变nlast的位置,直到 当前节点==last节点时。该层遍历完毕。last=nlast。即last跳到下一列的最右边。该层完成继续进行下一层

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/

class TreePrinter {
public:
	vector<vector<int> > printTree(TreeNode* root) {
		// write code here
		vector<vector<int>> result;
		vector<int> row;
		TreeNode* last = root;
		TreeNode* nlast = nullptr;
		TreeNode* node = nullptr;
		int level = 0;

		queue<TreeNode*> Q;
		Q.push(root);

		while (!Q.empty())
		{
			//打印队列中出队列
			node = Q.front();
			Q.pop();
			row.push_back(node->val);

			if(node->left){
				Q.push(node->left);
				nlast = node->left;
			}

			if (node->right)
			{
				Q.push(node->right);
				nlast = node->right;
			}

			if(node==last){
				last = nlast;
				result.push_back(row);
				row.clear();
			}


			//判断nlast情况
		}

		return result;
	}
};

猜你喜欢

转载自blog.csdn.net/odolgtt/article/details/91977410