前序遍历:按照“根-左-右”的顺序遍历。
中序遍历:按照“左-根-右”的顺序遍历。
后序遍历:按照“左-右-根”的顺序遍历。
递归版:
![](https://pics5.baidu.com/feed/a08b87d6277f9e2fc9dfb539cf843521b999f350.jpeg?token=9feb8ceb9f51eab875acba32a14968aa&s=EBA43C6211C558F11E5191CF000090B1)
递归版的代码非常简单,我给大家分析一下原理。
![](https://pics7.baidu.com/feed/91ef76c6a7efce1b728b12777ce52fdbb58f6522.jpeg?token=ba5373b58f7e3ec62aac888bdf491264&s=F99EAD1A97F86D82447D98D2000080B0)
①我们先忽略中间的打印语句,单独分析这个函数
②遍历顺序是不是这样的。
1->2->4->null->4->null->4->2->5->null->5->null->5->2->1->3->6->null->6->null->6->7->null->7->null->7->3->1
③我们把null去掉。
1->2->4->4->4->2->5->5->5->2->1->3->6->6->6->3->7->7->7->3->1
④里面的每一个数都出现了3次。
⑤若我们将这些数第一次出现就打印。就是先序遍历。
1->2->4->5->3->6->7
⑥若我们将这些数第二次出现就打印。就是中序遍历
4->2->5->1->6->3->7
⑦若我们将这些数第三次出现就打印。就是后序遍历
4->5->2->6->7->3->1
中序遍历代码:
![](https://pics6.baidu.com/feed/3801213fb80e7bec3ecb5afae29a653d9a506bd6.jpeg?token=e0b6885a6b2123ea22898b3f4af1963b&s=7994AD1A83E44D03447134D30000D0B1)
后序遍历代码:
![](https://pics6.baidu.com/feed/58ee3d6d55fbb2fb4f35edb681fefca14723dcb6.jpeg?token=d829e790107e60ce78fc22935ab53be8&s=7980AD1A97D04DC24C7CB0D3020080B1)
非递归版:
先序遍历。①先准备一个栈②先将根节点压入栈③弹出一个节点。打印节点。④若右孩子不为null,就将右孩子压栈。⑤若左孩子不为null,就将左孩子压栈。⑥重复3,4,5步直到栈为空。代码实现
![](https://pics3.baidu.com/feed/a2cc7cd98d1001e9d693c2b675baa7e955e79713.jpeg?token=5ce308548954350f6e89d4e0d300d875&s=7194ED3A13AECCEB025DC0DE000080B3)
中序遍历①先准备一个栈②若当前节点不为空,将当前节点压栈,然后来到左孩子③若当前节点为空,弹出一个节点并打印。然后来到右孩子。④当前节点非空或栈不为空执行2,3。代码实现
![](https://pics0.baidu.com/feed/f9198618367adab414412c3059606f198601e46e.jpeg?token=cc8b7dcc118c727f01c8f91878843fad&s=6194ED3B11AECCEC52D5E1D6000050B0)
后序遍历后序遍历如果只用一个栈来实现有点麻烦。递归版可以做到将一个节点压入栈中3次。自己压栈则有些麻烦。我们采用使用两个栈的方式来实现后序遍历。在实现前序遍历的非递归实现时,①压根节点,②压右节点,③压左节点(根->左->右)这样我们可以①压根节点,②压左节点,③压右节点将它放入一个栈中(根->右->左)然后将上面的栈倒进另一个栈中。就变成了(左->右->根)。为后序遍历顺序。2.代码实现:
![](https://pics2.baidu.com/feed/810a19d8bc3eb13562a3293a70aa74d6fc1f4401.jpeg?token=9f82bda4f3eb281ce12db3d71ecf984c&s=6196ED3A13AEE4EE0254D4DE000010B0)
全部代码:
![](https://pics6.baidu.com/feed/7af40ad162d9f2d3c9e4ca8a785856166227cc1d.jpeg?token=72e7c0befd6979ea9e4eb868f0a6d56c&s=4986ED1A137448201E7CB5D30000D0B3)
运行结果:
![](https://pics4.baidu.com/feed/f2deb48f8c5494ee306f1123e0413cfb98257ef1.jpeg?token=ddc38c00af3e04522831b27cb4c8725c&s=4F0ABC0A89C048C80E7D10DF000080B2)