您的位置:首页 > Web前端

剑指offer 23 - 从上往下打印二叉树

2015-05-25 19:53 253 查看
层序遍历:

      
   8

    6    10

5   7  9   11

依次打印:8,6,10,5,7,9,11

理解:层次遍历二叉树,借助队列,先将根入队列,根出列,打印根的值,并把根的左孩子和右孩子入队列,再出列,打印,入列(根的左孩子的  左孩子和右孩子),.....

#include <iostream>
#include<deque>
using namespace std;

struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
};

BinaryTreeNode*  CreateBinaryTreeNode(int value)
{
BinaryTreeNode* node = new BinaryTreeNode[sizeof(BinaryTreeNode)];
node->m_nValue = value;
node->m_pLeft = node->m_pRight = NULL;

return node;
}

void ConnectTreeNodes(BinaryTreeNode*	 root ,BinaryTreeNode*	 left, BinaryTreeNode*	 right)
{
if(root !=NULL)
{
root->m_pLeft = left;
root->m_pRight = right;
}
}

void    DestroyTree(BinaryTreeNode*	pRoot)
{
if(pRoot != NULL)
{
BinaryTreeNode* pLeft = pRoot->m_pLeft;
BinaryTreeNode* pRight = pRoot->m_pRight;

delete pRoot;
pRoot = NULL;

DestroyTree(pLeft);
DestroyTree(pRight);
}
}

void  PrintTreeNode(BinaryTreeNode*	pNode)   //节点打印(包含左右节点)
{
if(pNode !=NULL)
{
cout<<"value of this node is:"<<pNode->m_nValue<<endl;
if(pNode->m_pLeft !=NULL)
cout<<pNode->m_pLeft->m_nValue<<"	 ";
else
cout<<"left	 null"<<"	 ";
if(pNode->m_pRight !=NULL)
cout<<pNode->m_pRight->m_nValue<<"  ";
else
cout<<"right	 null"<<"	 ";
cout<<endl;
}
else
return ;
}

void   PrintTree(BinaryTreeNode* pRoot)   //中序遍历
{
PrintTreeNode(pRoot);

if(pRoot != NULL)
{
if(pRoot->m_pLeft != NULL)
PrintTree(pRoot->m_pLeft);

if(pRoot->m_pRight != NULL)
PrintTree(pRoot->m_pRight);
}
}

void  PrintFromTopToBottom(BinaryTreeNode	*pRoot)  //层序遍历
{
if(pRoot == NULL)
return ;
deque<BinaryTreeNode*> dequeTreeNode;
dequeTreeNode.push_back(pRoot);

while( dequeTreeNode.size())
{
BinaryTreeNode* node = dequeTreeNode.front();
dequeTreeNode.pop_front();

cout<<node->m_nValue<<"	   ";	//输出
if(node->m_pLeft)                   //存储左
dequeTreeNode.push_back(node->m_pLeft);
if(node->m_pRight)   //存储右
dequeTreeNode.push_back(node->m_pRight);
}
}

void Test(char *testName,BinaryTreeNode* root)
{
if(testName != NULL)
cout<<testName<<" begins: "<<endl;;

PrintTree(root);

cout<<"The nodes from top to bottom, from left to right are: \n";
PrintFromTopToBottom(root);

cout<<endl<<endl;
}

//            10
//         /      \
//        6        14
//       /\        /\
//      4  8     12  16
void Test1()
{
BinaryTreeNode* pNode10 = CreateBinaryTreeNode(10);
BinaryTreeNode* pNode6 = CreateBinaryTreeNode(6);
BinaryTreeNode* pNode14 = CreateBinaryTreeNode(14);
BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
BinaryTreeNode* pNode8 = CreateBinaryTreeNode(8);
BinaryTreeNode* pNode12 = CreateBinaryTreeNode(12);
BinaryTreeNode* pNode16 = CreateBinaryTreeNode(16);

ConnectTreeNodes(pNode10, pNode6, pNode14);
ConnectTreeNodes(pNode6, pNode4, pNode8);
ConnectTreeNodes(pNode14, pNode12, pNode16);

Test("test1",pNode10);
}

//               5
//              /
//             4
//            /
//           3
//          /
//         2
//        /
//       1
void Test2()
{
BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);
BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);
BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);

ConnectTreeNodes(pNode5, pNode4, NULL);
ConnectTreeNodes(pNode4, pNode3, NULL);
ConnectTreeNodes(pNode3, pNode2, NULL);
ConnectTreeNodes(pNode2, pNode1, NULL);

Test("Test2", pNode5);

DestroyTree(pNode5);
}

// 1
//  \
//   2
//    \
//     3
//      \
//       4
//        \
//         5
void Test3()
{
BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);
BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);
BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);
BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);

ConnectTreeNodes(pNode1, NULL, pNode2);
ConnectTreeNodes(pNode2, NULL, pNode3);
ConnectTreeNodes(pNode3, NULL, pNode4);
ConnectTreeNodes(pNode4, NULL, pNode5);

Test("Test3", pNode1);

DestroyTree(pNode1);
}

// 树中只有1个结点
void Test4()
{
BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);
Test("Test4", pNode1);

DestroyTree(pNode1);
}

// 树中没有结点
void Test5()
{
Test("Test5", NULL);
}
int main()
{
Test1();
Test2();
Test3();
Test4();
Test5();

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: