@@ -912,3 +912,345 @@ class Solution {
912912
913913- Time complexity: $O(n)$
914914- Space complexity: $O(n)$ for recursion stack.
915+
916+ ---
917+
918+ ## 4. Morris Traversal
919+
920+ :: tabs-start
921+
922+ ``` python
923+ # Definition for a binary tree node.
924+ # class TreeNode:
925+ # def __init__(self, val=0, left=None, right=None):
926+ # self.val = val
927+ # self.left = left
928+ # self.right = right
929+ class Solution :
930+ def buildTree (self , preorder : List[int ], inorder : List[int ]) -> Optional[TreeNode]:
931+ head = TreeNode(None )
932+ curr = head
933+ i, j, n = 0 , 0 , len (preorder)
934+ while i < n and j < n:
935+ # Go right and then as far left as possible
936+ curr.right = TreeNode(preorder[i], right = curr.right)
937+ curr = curr.right
938+ i += 1
939+ while i < n and curr.val != inorder[j]:
940+ curr.left = TreeNode(preorder[i], right = curr)
941+ curr = curr.left
942+ i += 1
943+ j += 1
944+ while curr.right and j < n and curr.right.val == inorder[j]:
945+ prev = curr.right
946+ curr.right = None
947+ curr = prev
948+ j += 1
949+
950+ return head.right
951+ ```
952+
953+ ``` java
954+ /**
955+ * Definition for a binary tree node.
956+ * public class TreeNode {
957+ * int val;
958+ * TreeNode left;
959+ * TreeNode right;
960+ * TreeNode() {}
961+ * TreeNode(int val) { this.val = val; }
962+ * TreeNode(int val, TreeNode left, TreeNode right) {
963+ * this.val = val;
964+ * this.left = left;
965+ * this.right = right;
966+ * }
967+ * }
968+ */
969+ public class Solution {
970+ public TreeNode buildTree (int [] preorder , int [] inorder ) {
971+ TreeNode head = new TreeNode (0 );
972+ TreeNode curr = head;
973+ int i = 0 , j = 0 , n = preorder. length;
974+
975+ while (i < n && j < n) {
976+ curr. right = new TreeNode (preorder[i], null , curr. right);
977+ curr = curr. right;
978+ i++ ;
979+ while (i < n && curr. val != inorder[j]) {
980+ curr. left = new TreeNode (preorder[i], null , curr);
981+ curr = curr. left;
982+ i++ ;
983+ }
984+ j++ ;
985+ while (curr. right != null && j < n && curr. right. val == inorder[j]) {
986+ TreeNode prev = curr. right;
987+ curr. right = null ;
988+ curr = prev;
989+ j++ ;
990+ }
991+ }
992+ return head. right;
993+ }
994+ }
995+ ```
996+
997+ ``` cpp
998+ /* *
999+ * Definition for a binary tree node.
1000+ * struct TreeNode {
1001+ * int val;
1002+ * TreeNode *left;
1003+ * TreeNode *right;
1004+ * TreeNode() : val(0), left(nullptr), right(nullptr) {}
1005+ * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
1006+ * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
1007+ * };
1008+ */
1009+ class Solution {
1010+ public:
1011+ TreeNode* buildTree(vector<int >& preorder, vector<int >& inorder) {
1012+ TreeNode* head = new TreeNode(0);
1013+ TreeNode* curr = head;
1014+ int i = 0, j = 0, n = preorder.size();
1015+
1016+ while (i < n && j < n) {
1017+ curr->right = new TreeNode(preorder[i], nullptr, curr->right);
1018+ curr = curr->right;
1019+ i++;
1020+ while (i < n && curr->val != inorder[j]) {
1021+ curr->left = new TreeNode(preorder[i], nullptr, curr);
1022+ curr = curr->left;
1023+ i++;
1024+ }
1025+ j++;
1026+ while (curr->right && j < n && curr->right->val == inorder[j]) {
1027+ TreeNode* prev = curr->right;
1028+ curr->right = nullptr;
1029+ curr = prev;
1030+ j++;
1031+ }
1032+ }
1033+ return head->right;
1034+ }
1035+ };
1036+ ```
1037+
1038+ ``` javascript
1039+ /**
1040+ * Definition for a binary tree node.
1041+ * class TreeNode {
1042+ * constructor(val = 0, left = null, right = null) {
1043+ * this.val = val;
1044+ * this.left = left;
1045+ * this.right = right;
1046+ * }
1047+ * }
1048+ */
1049+
1050+ class Solution {
1051+ /**
1052+ * @param {number[]} preorder
1053+ * @param {number[]} inorder
1054+ * @return {TreeNode}
1055+ */
1056+ buildTree (preorder , inorder ) {
1057+ let head = new TreeNode (null );
1058+ let curr = head;
1059+ let i = 0 , j = 0 , n = preorder .length ;
1060+
1061+ while (i < n && j < n) {
1062+ curr .right = new TreeNode (preorder[i], null , curr .right );
1063+ curr = curr .right ;
1064+ i++ ;
1065+ while (i < n && curr .val !== inorder[j]) {
1066+ curr .left = new TreeNode (preorder[i], null , curr);
1067+ curr = curr .left ;
1068+ i++ ;
1069+ }
1070+ j++ ;
1071+ while (curr .right && j < n && curr .right .val === inorder[j]) {
1072+ let prev = curr .right ;
1073+ curr .right = null ;
1074+ curr = prev;
1075+ j++ ;
1076+ }
1077+ }
1078+ return head .right ;
1079+ }
1080+ }
1081+ ```
1082+
1083+ ``` csharp
1084+ /**
1085+ * Definition for a binary tree node.
1086+ * public class TreeNode {
1087+ * public int val;
1088+ * public TreeNode left;
1089+ * public TreeNode right;
1090+ * public TreeNode(int val=0, TreeNode left=null, TreeNode right=null) {
1091+ * this.val = val;
1092+ * this.left = left;
1093+ * this.right = right;
1094+ * }
1095+ * }
1096+ */
1097+ public class Solution {
1098+ public TreeNode BuildTree (int [] preorder , int [] inorder ) {
1099+ TreeNode head = new TreeNode (0 );
1100+ TreeNode curr = head ;
1101+ int i = 0 , j = 0 , n = preorder .Length ;
1102+
1103+ while (i < n && j < n ) {
1104+ curr .right = new TreeNode (preorder [i ], null , curr .right );
1105+ curr = curr .right ;
1106+ i ++ ;
1107+ while (i < n && curr .val != inorder [j ]) {
1108+ curr .left = new TreeNode (preorder [i ], null , curr );
1109+ curr = curr .left ;
1110+ i ++ ;
1111+ }
1112+ j ++ ;
1113+ while (curr .right != null && j < n && curr .right .val == inorder [j ]) {
1114+ TreeNode prev = curr .right ;
1115+ curr .right = null ;
1116+ curr = prev ;
1117+ j ++ ;
1118+ }
1119+ }
1120+ return head .right ;
1121+ }
1122+ }
1123+ ```
1124+
1125+ ``` go
1126+ /* *
1127+ * Definition for a binary tree node.
1128+ * type TreeNode struct {
1129+ * Val int
1130+ * Left *TreeNode
1131+ * Right *TreeNode
1132+ * }
1133+ */
1134+ func buildTree (preorder []int , inorder []int ) *TreeNode {
1135+ head := &TreeNode{}
1136+ curr := head
1137+ i , j , n := 0 , 0 , len (preorder)
1138+
1139+ for i < n && j < n {
1140+ curr.Right = &TreeNode{Val: preorder[i], Right: curr.Right }
1141+ curr = curr.Right
1142+ i++
1143+ for i < n && curr.Val != inorder[j] {
1144+ curr.Left = &TreeNode{Val: preorder[i], Right: curr}
1145+ curr = curr.Left
1146+ i++
1147+ }
1148+ j++
1149+ for curr.Right != nil && j < n && curr.Right .Val == inorder[j] {
1150+ prev := curr.Right
1151+ curr.Right = nil
1152+ curr = prev
1153+ j++
1154+ }
1155+ }
1156+ return head.Right
1157+ }
1158+ ```
1159+
1160+ ``` kotlin
1161+ /* *
1162+ * Example:
1163+ * var ti = TreeNode(5)
1164+ * var v = ti.`val`
1165+ * Definition for a binary tree node.
1166+ * class TreeNode(var `val`: Int) {
1167+ * var left: TreeNode? = null
1168+ * var right: TreeNode? = null
1169+ * }
1170+ */
1171+ class Solution {
1172+ fun buildTree (preorder : IntArray , inorder : IntArray ): TreeNode ? {
1173+ val head = TreeNode (0 )
1174+ var curr: TreeNode ? = head
1175+ var i = 0
1176+ var j = 0
1177+ val n = preorder.size
1178+
1179+ while (i < n && j < n) {
1180+ curr!! .right = TreeNode (preorder[i], null , curr.right)
1181+ curr = curr.right
1182+ i++
1183+ while (i < n && curr!! .`val ` != inorder[j]) {
1184+ curr.left = TreeNode (preorder[i], null , curr)
1185+ curr = curr.left
1186+ i++
1187+ }
1188+ j++
1189+ while (curr!! .right != null && j < n && curr.right!! .`val ` == inorder[j]) {
1190+ val prev = curr.right
1191+ curr.right = null
1192+ curr = prev
1193+ j++
1194+ }
1195+ }
1196+ return head.right
1197+ }
1198+ }
1199+ ```
1200+
1201+ ``` swift
1202+ /**
1203+ * Definition for a binary tree node.
1204+ * public class TreeNode {
1205+ * public var val: Int
1206+ * public var left: TreeNode?
1207+ * public var right: TreeNode?
1208+ * public init() { self.val = 0; self.left = nil; self.right = nil; }
1209+ * public init(_ val: Int) { self.val = val; self.left = nil; self.right = nil; }
1210+ * public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) {
1211+ * self.val = val
1212+ * self.left = left
1213+ * self.right = right
1214+ * }
1215+ * }
1216+ */
1217+ class Solution {
1218+ func buildTree (_ preorder : [Int ], _ inorder : [Int ]) -> TreeNode? {
1219+ let head = TreeNode (0 )
1220+ var curr: TreeNode? = head
1221+ var i = 0 , j = 0
1222+ let n = preorder.count
1223+
1224+ while i < n && j < n {
1225+ curr! .right = TreeNode (preorder[i], nil , curr! .right )
1226+ curr = curr! .right
1227+ i += 1
1228+
1229+ while i < n && curr! .val != inorder[j] {
1230+ curr! .left = TreeNode (preorder[i], nil , curr)
1231+ curr = curr! .left
1232+ i += 1
1233+ }
1234+
1235+ j += 1
1236+ while curr! .right != nil && j < n && curr! .right! .val == inorder[j] {
1237+ let prev = curr! .right
1238+ curr! .right = nil
1239+ curr = prev
1240+ j += 1
1241+ }
1242+ }
1243+
1244+ return head.right
1245+ }
1246+ }
1247+ ```
1248+
1249+ :: tabs-end
1250+
1251+ ### Time & Space Complexity
1252+
1253+ * Time complexity: $O(n)$
1254+ * Space complexity:
1255+ * $O(1)$ extra space.
1256+ * $O(n)$ for the output tree.
0 commit comments