这题不是普通的层次遍历,而且要分清每一层,办法就是对每一层的节点标注编号,编号相同的在同一层,队列里的元素是经过编号后的新结构体,刚开始想用1,2,4,8来编号这样能表示所有的节点,但是当层数多的时候数字不够用了,所以只能用012345678来编号了。如下:
// LeetCode_BinaryTreeLevelOrderTraversal.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
struct QueNode{
int num;
TreeNode *pTreeNode;
QueNode():num(0),pTreeNode(NULL){}
};
vector<vector<int> > levelOrder(TreeNode *root) {
vector<vector<int> >ret;
vector<int> oneresult;
if(root==NULL)
return ret;
queue<QueNode> que;
QueNode qn;
qn.num = 0;
qn.pTreeNode = root;
que.push(qn);
QueNode tempNode,tempLeftNode,tempRightNode;
int lastnum = 0;
while(!que.empty())
{
tempNode = que.front();
que.pop();
if (lastnum!=tempNode.num)
{
ret.push_back(oneresult);
oneresult.clear();
oneresult.push_back(tempNode.pTreeNode->val);
lastnum = tempNode.num;
}
else
oneresult.push_back(tempNode.pTreeNode->val);
if (tempNode.pTreeNode->left)
{
tempLeftNode.num = tempNode.num+1;
tempLeftNode.pTreeNode = tempNode.pTreeNode->left;
que.push(tempLeftNode);
}
if (tempNode.pTreeNode->right)
{
tempRightNode.num = tempNode.num+1;
tempRightNode.pTreeNode = tempNode.pTreeNode->right;
que.push(tempRightNode);
}
}
ret.push_back(oneresult);
oneresult.clear();
return ret;
}
int _tmain(int argc, _TCHAR* argv[])
{
TreeNode *pa = new TreeNode(1);
TreeNode *pb = new TreeNode(2);
TreeNode *pc = new TreeNode(2);
TreeNode *pd = new TreeNode(3);//TreeNode *pd = NULL;//
TreeNode *pe = new TreeNode(4);
TreeNode *pf = NULL;//TreeNode *pf = new TreeNode(3);
TreeNode *pg = new TreeNode(3);
pa->left = pb;
pa->right = pc;
pb->left = pd;
pb->right = pe;
pc->left = pf;
pc->right = pg;
vector<vector<int> >ret;
ret = levelOrder(pa);
system("pause");
return 0;
}

本文介绍了一种特殊的二叉树层次遍历方法,通过为每个节点分配唯一编号来区分不同层级,确保正确地按层输出节点值。使用C++实现,并提供了具体的代码示例。
310

被折叠的 条评论
为什么被折叠?



